docker-compose 不断重启的问题 command ENTRYPOINT?

我的配置方式一:

dockerfile

ENTRYPOINT ['/bin/bash',"/bar/www/sh.sh"]

CMD ["php-fpm"]

docker-compose

tty: true

无 command

我的配置方案二:

只配置docker-compose 并且将 docekrfile 中的 ENTRYPOINT 去掉

command ['/bin/bash',"/bar/www/sh.sh"]

两个方案都是 docker 一直在重启。我打印日志看到sh.sh 是成功运行的。

我的sh.sh 是一个后台运行的脚本

无论我是在dockerfile 里面写 还是在docker-compose 里面写,感觉是执行了command 后挂起的程序就失效了,比如我的 CMD 里面的 php-fpm 就是要让容器一直挂着的。

请问出现这样的问题是怎么回事?

我应该如何配置我的dockerfile 或者 docker-compose 让容器在运行的时候执行我的后台运行脚本

阅读 2.6k
avatarAI BotBETA

这个问题出现的原因在于 ENTRYPOINTCMD 在 Docker 中的不同行为。ENTRYPOINT 是容器启动时要运行的命令,而 CMD 是为 ENTRYPOINT 提供默认参数的。当 docker-compose 启动容器时,它会覆盖 Dockerfile 中的 CMD,但不会覆盖 ENTRYPOINT

在你的配置方案一中,ENTRYPOINT/bin/bash,并且它的参数是 "/bar/www/sh.sh"。当容器启动时,它会尝试执行这个脚本,但是由于你的 sh.sh 脚本是后台运行的,所以 /bin/bash 进程会立即退出,导致容器也退出,然后 Docker 会重新启动容器。这就是为什么你看到容器一直在重启的原因。

在配置方案二中,你在 docker-compose 中设置了 command,这实际上覆盖了 Dockerfile 中的 ENTRYPOINTCMD。但是,同样的问题也会发生,因为你的 sh.sh 脚本是后台运行的,所以 command 也会立即退出,导致容器退出并重新启动。

为了解决这个问题,你可以尝试以下配置:

  1. Dockerfile 中只设置 ENTRYPOINT,不设置 CMD
ENTRYPOINT ['/bin/bash', '/bar/www/sh.sh']
  1. docker-compose 中设置 commandphp-fpm,并且使用 detach 选项让 sh.sh 脚本在后台运行:
command: php-fpm
tty: true
detach: true

这样,当容器启动时,它会首先执行 sh.sh 脚本,然后将其放入后台运行。接着,它会启动 php-fpm,这将使容器保持运行状态,即使 sh.sh 脚本完成执行。

请注意,detach 选项不是 Docker 官方支持的功能,而是某些 Docker 客户端(如 Docker Compose)提供的。因此,它可能不在所有环境中都可用。

另一个选择是在 sh.sh 脚本中添加一个无限循环,使其保持运行状态,而不是在后台运行。例如:

#!/bin/bash
/bar/www/sh.sh &
while true; do
  sleep 1
done

这样,即使 sh.sh 脚本完成执行,无限循环也会使容器保持运行状态。

1 个回答

看了AI 的回复测试后
发现不管是在dockerfile 中的 cmd 或者 ENTRYPOINT 都需要让程序挂起,不然容器会退出

我的解决办法是
去掉dockerfile 中的cmd 和 ENTRYPOINT
在docker-compose 中直接去执行这个sh 脚本

command: ['/bin/bash',"/bar/www/sh.sh"]

或者

entrypoint: ['/bin/bash',"/bar/www/sh.sh"]

shell 脚本中

最后一句

php-fpm

如果不是php 可以写

tail -f /dev/null

这样就可以让容器保持运行并且也成功的执行了脚本

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进