使用 docker-compose,即使 "command" 失败,我如何保留容器 运行?
With docker-compose, how do I keep a container running even if the "command" fails?
我在 Mac Big Sur 上使用 docker 20.10.12。我的 docker-compose 文件
中有以下片段
web:
restart: "no"
build: ../my-dir
ports:
- "3000:3000"
expose:
- '3000'
command: /bin/sh -c "foreman start -f myprocfile”
volumes:
- ../cfs-web/:/app
depends_on:
- db
问题是如果我的“命令”失败,容器就会死掉,我无法执行它。如果我将重新启动更改为
Restart: “always”
容器不断重启并失败,但我仍然无法执行,因为似乎每次都在重新创建容器。有没有办法在命令失败时保持容器运行(这样我就可以登录并可能 运行 一些其他命令)?
有一些可能性。基本上,您只想在主命令失败后无限期地等待(或足够长的时间让您执行到容器中)。以下是一些示例:
command: /bin/sh -c "foreman start -f myprocfile || sleep 2073600”
command: /bin/sh -c "foreman start -f myprocfile || tail -f /dev/null”
command: /bin/sh -c "foreman start -f myprocfile || while :; do sleep 2073600; done"
显然这是一个会阻塞 cpu 周期的肮脏 hack,因此它应该只用于本地调试。
编辑:您可能希望将 ||
替换为 ;
,以防您的命令实际上并未失败,而是成功退出。
我在 Mac Big Sur 上使用 docker 20.10.12。我的 docker-compose 文件
中有以下片段 web:
restart: "no"
build: ../my-dir
ports:
- "3000:3000"
expose:
- '3000'
command: /bin/sh -c "foreman start -f myprocfile”
volumes:
- ../cfs-web/:/app
depends_on:
- db
问题是如果我的“命令”失败,容器就会死掉,我无法执行它。如果我将重新启动更改为
Restart: “always”
容器不断重启并失败,但我仍然无法执行,因为似乎每次都在重新创建容器。有没有办法在命令失败时保持容器运行(这样我就可以登录并可能 运行 一些其他命令)?
有一些可能性。基本上,您只想在主命令失败后无限期地等待(或足够长的时间让您执行到容器中)。以下是一些示例:
command: /bin/sh -c "foreman start -f myprocfile || sleep 2073600”
command: /bin/sh -c "foreman start -f myprocfile || tail -f /dev/null”
command: /bin/sh -c "foreman start -f myprocfile || while :; do sleep 2073600; done"
显然这是一个会阻塞 cpu 周期的肮脏 hack,因此它应该只用于本地调试。
编辑:您可能希望将 ||
替换为 ;
,以防您的命令实际上并未失败,而是成功退出。