脚本从Docker容器开始

时间:2019-07-10 14:54:27

标签: docker dockerfile

我想为我的项目创建一个脚本,该脚本在每次容器启动或重新启动时启动。该脚本应在控制台中运行某些语句,例如控制台/蛋糕模式等。 我正在将Cakephp 2.x用于我的项目和Docker。

我使用CMD或ENTRYPOINT在docker文件中尝试过,但是如果脚本完成,则过程结束。我的容器停了。

CMD ["/bin/bash", "/starter.sh"]

ENTRYPOINT ["/starter.sh"]

COPY starter.sh /
RUN chmod +x /starter.sh

有了第一个和第二个脚本,我得到了脚本,但是主要的prozess没有运行。

第三次尝试时脚本没有运行,但我的项目运行了。

2 个答案:

答案 0 :(得分:1)

从文档中:

  

ENTRYPOINT允许您配置将作为可执行文件运行的容器。

对于CMD也是如此:

  

CMD的主要目的是为执行中的容器提供默认值。这些默认值可以包含可执行文件,也可以忽略可执行文件,在这种情况下,您还必须指定ENTRYPOINT指令。

因此这些用于主要可执行文件。因此,您的第三次尝试是朝正确的方向进行,您只忘记了一个重要步骤:使用chmod +x

使脚本可执行后执行脚本

如果您包含另一个RUN语句,例如:

RUN /starter.sh

您的脚本将运行

请注意文档中关于RUN的内容:

  

RUN指令将在当前图像顶部的新层中执行所有命令,并提交结果。生成的提交映像将用于Dockerfile中的下一步。

这意味着,如果docker没有看到不同的结果,它将缓存运行结果,这意味着该脚本仅在首次创建映像或脚本更改时运行。无论如何,这很可能是您想要的行为,但是您可以在没有这种缓存行为的情况下运行它:

  

在下一个版本中,RUN指令的缓存不会自动失效。诸如RUN apt-get dist-upgrade -y之类的指令的缓存将在下一次构建中重用。可以使用--no-cache标志使RUN指令的缓存无效,例如docker build --no-cache。

我还建议您查看RUN语句的最佳做法:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#run

答案 1 :(得分:0)

我认为您可以在手册中查看RUN和CMD。但是我也注意到您说脚本完成后该过程停止了。您确定您的脚本不会停止吗?如果您的过程将停止,那么无论您做什么,容器都会在最后停止。