为何Supervisord仅通过Docker-Compose启动,docker run无法正常运行?
问题原因
1. docker run命令覆盖了默认启动指令
Docker镜像中定义的CMD指令会被docker run末尾传入的自定义命令直接覆盖。你执行的docker run -it -d nginx-custom:1.21.1 /bin/bash中,末尾的/bin/bash替换了Dockerfile里写的CMD ["service supervisor restart"],容器启动后只会运行bash进程,完全没有执行supervisor的启动命令,进入容器自然看不到相关进程。
2. docker compose没有覆盖启动指令
你编写的compose配置中没有指定command字段,所以容器启动时会默认执行Dockerfile中定义的启动supervisor的CMD指令,因此相关进程可以正常运行。
额外优化建议
你当前的启动命令存在潜在问题:service supervisor restart属于一次性执行命令,执行完成后主进程就会退出,正常情况下容器会随之停止。你现在用compose能正常运行,完全依赖配置里的tty: true参数给容器挂了伪终端保持运行,不符合容器单主进程的最佳实践。
建议将Dockerfile中的CMD替换为前台启动supervisord的指令:
CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor/supervisord.conf"]
修改后无需依赖tty配置,容器即可稳定运行,进程管理也更符合Docker的设计规范。
内容的提问来源于stack exchange,提问作者adampweb
相关产品推荐
相关产品推荐

