Docker容器执行script.sh后自动停止问题求助
解决Docker容器启动后立刻停止的问题
嘿,刚接触Docker和Stack Overflow的法国朋友,别担心,我来帮你搞定这个头疼的容器停止问题!
问题根源
Docker容器的生命周期是和主进程绑定的:只要主进程结束,容器就会立刻停止。你的script.sh执行完service bind9 restart就结束了——因为service bind9 restart是让bind9在后台运行,脚本本身跑完就没有持续运行的前台进程了,所以容器自然就停了。
具体解决方案
1. 修改启动脚本,让bind9以前台模式运行
这是核心!把script.sh的最后一行从service bind9 restart改成直接启动bind9的前台进程,这样脚本最后一步会持续运行,成为容器的主进程。
修改后的script.sh示例:
service bind9 stop # 这里执行你的配置文件复制替换操作 # 启动bind9前台模式(-g参数让它输出日志到控制台,方便调试) named -g
2. 调整Dockerfile的启动命令(可选但更规范)
你的Dockerfile里ENTRYPOINT和CMD的组合其实有点冗余,而且别忘了给脚本加执行权限!简化后的Dockerfile如下:
FROM debian RUN apt-get update && apt-get install -y bind9 ADD script.sh /usr/bin/script.sh RUN chmod +x /usr/bin/script.sh # 务必确保脚本有执行权限 ENTRYPOINT ["/usr/bin/script.sh"]
3. 完善端口映射
DNS协议同时使用TCP和UDP,所以运行容器时最好同时映射两个端口:
docker run -d -p 53:53/tcp -p 53:53/udp alex/dns
为什么你之前的方法没用?
- 加
CMD ["bash"]:因为你设置了ENTRYPOINT,CMD的参数会传给ENTRYPOINT,实际执行的是/bin/bash script.sh /bin/bash,脚本跑完还是会结束,容器依然停止。 docker commit:只是保存了容器的临时状态,但没有解决主进程结束的根本问题,重新启动容器还是会停。-d参数:只是让容器后台运行,不影响主进程结束后容器停止的逻辑。
验证步骤
- 重新构建镜像:
docker build -t alex/dns . - 启动容器:用上面完善后的
docker run命令 - 检查容器状态:
docker ps,应该能看到容器处于运行状态 - 进入容器操作:
docker exec -it <你的容器ID> bash
如果还有问题,随时告诉我,祝你Docker学习之旅顺利!
内容的提问来源于stack exchange,提问作者Spack_Jarrow
相关产品推荐
相关产品推荐

