这个问题出现的原因在于 ENTRYPOINT
和 CMD
在 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
中的 ENTRYPOINT
和 CMD
。但是,同样的问题也会发生,因为你的 sh.sh
脚本是后台运行的,所以 command
也会立即退出,导致容器退出并重新启动。
为了解决这个问题,你可以尝试以下配置:
- 在
Dockerfile
中只设置 ENTRYPOINT
,不设置 CMD
:
ENTRYPOINT ['/bin/bash', '/bar/www/sh.sh']
- 在
docker-compose
中设置 command
为 php-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
脚本完成执行,无限循环也会使容器保持运行状态。
看了AI 的回复测试后
发现不管是在dockerfile 中的 cmd 或者 ENTRYPOINT 都需要让程序挂起,不然容器会退出
我的解决办法是
去掉dockerfile 中的cmd 和 ENTRYPOINT
在docker-compose 中直接去执行这个sh 脚本
或者
shell 脚本中
最后一句
如果不是php 可以写
这样就可以让容器保持运行并且也成功的执行了脚本