当前位置: 首页 > 知识库问答 >
问题:

解决方案 - docker-compose 不断重启的问题 command ENTRYPOINT?

锺博耘
2024-03-03

我的配置方式一:

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个答案

花俊雄
2024-03-03

看了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

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

颛孙钱青
2024-03-03

这个问题出现的原因在于 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-fpmtty: truedetach: true

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

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

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

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

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

 类似资料:
  • 本文向大家介绍CentOS7 安装docker 解决启动不了的问题,包括了CentOS7 安装docker 解决启动不了的问题的使用技巧和注意事项,需要的朋友参考一下  CentOS7安装docker 启动不了,在工作当中遇到这个问题,当时急的不清,网上资料又不多,不过经过自己的捣鼓终于解决了 这个问题! 3月 10 13:01:20 test.mayocase.com systemd[1]: F

  • 本文向大家介绍解决docker重启redis,mysql数据丢失的问题,包括了解决docker重启redis,mysql数据丢失的问题的使用技巧和注意事项,需要的朋友参考一下 官方文档: 所以 mysql应如下启动: docker run -p 3306:3306 -d -e MYSQL_ROOT_PASSWORD=密码 -v /windows盘符/指定的文件夹路径:/var/lib/mysql 

  • 10.10. 公共问题的解决方案 10.10.1. 对一个特定的 DataSource 使用错误的事务管理器 开发者需要按照需求仔细地选择正确的 PlatformTransactionManager 实现。理解Spring的事务抽象如何与JTA全局事务一起工作是非常重要的。使用得当,就不会有任何冲突:Spring仅仅提供一个直观的、可移植的抽象层。 如果你使用全局事务,你 必须 为你的所有事务操作

  • 本文向大家介绍Nginx tp3.2.3 404问题解决方案,包括了Nginx tp3.2.3 404问题解决方案的使用技巧和注意事项,需要的朋友参考一下 最近我把Apache给换成nginx,当我把tp项目搬过去运行的时候发现404 错误 ,原来是因为nginx不支持 pathinfo 模式,需要自己配置 下面我配置 在server配置里面 保存配置之后,重启 nginx ,配置成功 直接支持类

  • 解决方案常见问题 Windows Needing to re-target the Windows SDK XCode XCode PNG Compression issue It is possible that your PNG images contain incorrect color profiles. You can convert color profiles using Image

  • 本文向大家介绍eclipse连接不到genymotion问题的解决方案,包括了eclipse连接不到genymotion问题的解决方案的使用技巧和注意事项,需要的朋友参考一下 (1)很多朋友在使用genymotion开发安卓应用程序的时候,会遇见完全正确的安装但是在运行的时候仍然找不到,genymotion上的设备,在打开的devices上找不到如下图所示: (2)解决的方法如下: 1、关闭ecl