使用 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,因此它应该只用于本地调试。

编辑:您可能希望将 || 替换为 ;,以防您的命令实际上并未失败,而是成功退出。