我的Dockerfile
FROM ubuntu
WORKDIR .
RUN apt-get update
RUN apt-get install apache2 -y
COPY fffff.txt /var/www/html/
ENTRYPOINT ["sh", "-c", "touch /root/FILE1"]
我正在使用的版本
docker build -ti first:latest .
但是当我尝试使用
运行它时docker run -it -d first:latest bash
它将直接退出,如何使该容器持久化?
答案 0 :(得分:0)
请查看ENTRYPOINT
在Docker中的工作方式。如果您传递任何命令(如CMD
或使用bash一样),它将运行该命令,因此您的情况将是:
"sh", "-c", "touch /root/FILE1" bash
这完全没有道理。
如果要在容器内创建文件并将其作为守护程序运行,请执行以下操作:
Dockerfile :
FROM ubuntu
WORKDIR .
RUN apt-get update
RUN apt-get install apache2 -y
COPY fffff.txt /var/www/html/
RUN touch /root/myfile
以与您相同的方式进行构建,但运行方式如下:
docker run -it -d first:latest /bin/bash
当心,它将作为守护程序运行容器(-d
标志),因此它将不会进入容器的外壳。
如果要附加到守护程序容器,请使用docker attach <container_id>
(或<container_name>
)
答案 1 :(得分:0)
ENTRYPOINT
和CMD
指令告诉Docker从映像启动容器时该怎么做。
您要告诉Docker,当它从映像启动容器时,它应该在容器的临时文件系统中创建一个空文件。该过程完成后,容器将完成其工作,应退出。
实际上,您通常希望实际设置此元数据以告知Docker运行您已安装到映像中的服务器或应用程序,作为前台进程。就Apache而言,它看起来更像
CMD ["apachectl", "start", "-DFOREGROUND"]
在容器中获取交互式shell可以很方便地进行调试,但通常不是您要使用容器的方式。理想情况下,docker run
本身应该可以生产功能齐全的服务器。
答案 2 :(得分:0)
两天后,我遇到了同样的问题:
What is the difference between CMD and ENTRYPOINT in a Dockerfile?
Docker RUN vs CMD vs ENTRYPOINT
并构建并运行约30个Dockerfile:| ,最后我找到了可以触摸文件并使容器持久而不退出的方式。
我像您一样使用ENTRYPOINT,但是以这种方式在最后一条命令中添加了sh
:
ENTRYPOINT [ "sh", "-c", "touch 1.txt && echo hello >> 1.txt && echo $myvar && sh" ]
ENTRYPOINT touch 1.txt && echo hello >> 1.txt && echo $myvar && sh
这两种形式都是持久性的,在执行此命令后不会退出:
docker run -it --rm --name mycontainer -e "myvar=parsa" imagename
这两种形式的优点是它们支持变量替换,并且您可以运行由&&
分隔的多个命令。
祝你好运。