You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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参数:只是让容器后台运行,不影响主进程结束后容器停止的逻辑。

验证步骤

  1. 重新构建镜像:docker build -t alex/dns .
  2. 启动容器:用上面完善后的docker run命令
  3. 检查容器状态:docker ps,应该能看到容器处于运行状态
  4. 进入容器操作:docker exec -it <你的容器ID> bash

如果还有问题,随时告诉我,祝你Docker学习之旅顺利!

内容的提问来源于stack exchange,提问作者Spack_Jarrow

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:16:08