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 &
答案 0 :(得分:0)
Dockerfile中的CMD
步骤在映像上设置元数据,告诉docker运行容器时要运行的默认命令。 CMD
只能有一个值,因此第二次设置将覆盖以前的任何设置。
容器只能启动一个进程,并且该进程在容器内以pid 1的身份运行。该进程退出后,整个容器将停止运行,包括运行的所有后台进程。
因此,您需要将CMD
设置为要运行的任何命令或脚本,并且该命令需要在容器的整个生命周期内保持运行状态。就像在脚本的最后一行运行tail -f /dev/null
一样容易。但是,建议的做法是在前台运行您的应用程序,而不是在后台运行的后台程序,这可能会引起注意。我真的希望您在一个容器中需要多个守护程序,其中包括诸如supervisor之类的工具。但是在大多数情况下,最好运行多个容器(每个服务一个),并通过共享的docker网络在这些服务之间进行通信。 docker-compose
对于设置此网络并以适当的配置部署容器非常有用。