使用dos2unix的docker入口点

时间:2019-10-18 17:31:35

标签: docker dockerfile

  • 当我运行 docker-compose up -d --build
  • dockerfile不会触发CMD bash /webapp/runscript.sh
  • 不同的说法...当我执行到容器中时,我看不到redis-server或celery应用程序正在运行
  • 如果我手动运行“ bash /webapp/runscrip.sh”;进程最终运行
  • 我最初也尝试过 Entrypoint ['bash','/webapp/runscript.sh'] 没有运气。不知道我在想什么

dockerfile的尾端

RUN mkdir -p /logs

COPY runscript.sh /webapp/runscript.sh
RUN chmod -R u+x /webapp/runscript.sh
RUN dos2unix /webapp/runscript.sh
CMD bash /webapp/runscript.sh

CMD tail -f /dev/null

runscript.sh

#!/bin/bash

nohup redis-server > /logs/redis.out &
nohup celery -A app.celery worker --loglevel=info > /logs/celery_worker.out &
nohup celery flower -A app.celery > /logs/celery_flower.out &

1 个答案:

答案 0 :(得分:0)

Dockerfile中的CMD步骤在映像上设置元数据,告诉docker运行容器时要运行的默认命令。 CMD只能有一个值,因此第二次设置将覆盖以前的任何设置。

容器只能启动一个进程,并且该进程在容器内以pid 1的身份运行。该进程退出后,整个容器将停止运行,包括运行的所有后台进程。

因此,您需要将CMD设置为要运行的任何命令或脚本,并且该命令需要在容器的整个生命周期内保持运行状态。就像在脚本的最后一行运行tail -f /dev/null一样容易。但是,建议的做法是在前台运行您的应用程序,而不是在后台运行的后台程序,这可能会引起注意。我真的希望您在一个容器中需要多个守护程序,其中包括诸如supervisor之类的工具。但是在大多数情况下,最好运行多个容器(每个服务一个),并通过共享的docker网络在这些服务之间进行通信。 docker-compose对于设置此网络并以适当的配置部署容器非常有用。