当容器开始使用Dockerfile时如何触摸文件

时间:2019-03-02 17:23:01

标签: docker dockerfile

我的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 

它将直接退出,如何使该容器持久化?

3 个答案:

答案 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)

ENTRYPOINTCMD指令告诉Docker从映像启动容器时该怎么做。

您要告诉Docker,当它从映像启动容器时,它应该在容器的临时文件系统中创建一个空文件。该过程完成后,容器将完成其工作,应退出。

实际上,您通常希望实际设置此元数据以告知Docker运行您已安装到映像中的服务器或应用程序,作为前台进程。就Apache而言,它看起来更像

CMD ["apachectl", "start", "-DFOREGROUND"]

在容器中获取交互式shell可以很方便地进行调试,但通常不是您要使用容器的方式。理想情况下,docker run本身应该可以生产功能齐全的服务器。

答案 2 :(得分:0)

两天后,我遇到了同样的问题:

Docker docs : CMD

Docker docs : ENTRYPOINT

What is the difference between CMD and ENTRYPOINT in a Dockerfile?

Docker RUN vs CMD vs ENTRYPOINT

并构建并运行约30个Dockerfile:| ,最后我找到了可以触摸文件并使容器持久而不退出的方式。

我像您一样使用ENTRYPOINT,但是以这种方式在最后一条命令中添加了sh

exec形式:

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

这两种形式的优点是它们支持变量替换,并且您可以运行由&&分隔的多个命令。

祝你好运。