我想为我的项目创建一个脚本,该脚本在每次容器启动或重新启动时启动。该脚本应在控制台中运行某些语句,例如控制台/蛋糕模式等。 我正在将Cakephp 2.x用于我的项目和Docker。
我使用CMD或ENTRYPOINT在docker文件中尝试过,但是如果脚本完成,则过程结束。我的容器停了。
CMD ["/bin/bash", "/starter.sh"]
或
ENTRYPOINT ["/starter.sh"]
或
COPY starter.sh /
RUN chmod +x /starter.sh
有了第一个和第二个脚本,我得到了脚本,但是主要的prozess没有运行。
第三次尝试时脚本没有运行,但我的项目运行了。
答案 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。但是我也注意到您说脚本完成后该过程停止了。您确定您的脚本不会停止吗?如果您的过程将停止,那么无论您做什么,容器都会在最后停止。