如何让Docker Compose容器持续运行?当前启动后即停止
如何让Docker Compose容器持续运行?
我来帮你排查并解决这个容器停止的问题,先看看你当前配置里的几个核心问题:
问题出在哪?
docker-compose.yml的语法错误
你在services.execute下面单独放了volume: nocopy: true,这位置不对——nocopy选项应该嵌套在每个具体的volume配置块里,而不是单独拎出来。另外你还写了两次command字段,虽然后面的会覆盖前面的,但语法错误可能导致Compose没正确加载你的命令配置。容器默认命令执行完就退出
你的Dockerfile里设置了ENTRYPOINT /bin/sh和CMD scar init -n SREBlack -i image,容器启动后会执行/bin/sh scar init -n SREBlack -i image,这个命令跑完就结束了。容器的生命周期和主进程绑定,主进程一结束容器就跟着停了。
修正后的docker-compose.yml配置
我帮你把语法修正,同时加上能让容器持续运行的命令:
version: "3.7" services: execute: image: abc/SREBlackBoxTester labels: - mylabelOne="SREBlackBoxTester" volumes: - type: volume source: AWS_CREDENTIALS_FOLDER target: /home/scar/.aws volume: nocopy: true # 把nocopy放到对应volume的配置块里 - type: volume source: SCAR_CONFIG_FOLDER target: /home/scar/.scar volume: nocopy: true command: tail -f /dev/null # 这个命令会让主进程一直运行,容器就不会停 volumes: AWS_CREDENTIALS_FOLDER: SCAR_CONFIG_FOLDER:
其他可选方案
如果你更喜欢用循环sleep的方式,也可以把command换成这个:
command: bash -c "while true; do sleep 10; done"
要是你希望容器先执行scar init初始化操作,再保持运行,可以这样写command:
command: bash -c "scar init -n SREBlack -i image && tail -f /dev/null"
原理说明
容器能持续运行的关键是让容器内的主进程一直处于活跃状态,tail -f /dev/null或者无限循环的sleep命令都是让主进程不退出的简单手段,只要主进程不结束,容器就会一直保持运行状态。
内容的提问来源于stack exchange,提问作者Carolyn Cordeiro
相关产品推荐
相关产品推荐

