【问题标题】:Docker running a command on container start upDocker 在容器启动时运行命令
【发布时间】:2023-03-09 23:54:01
【问题描述】:

我有一个 docker 容器,我需要为此运行以下命令

php /var/www/html/artisan queue:work &

它启动一个工作进程来查找并执行它们。

我可以在容器运行时执行 exec -it 来运行它。

但是我需要使用 Dockerfile 来完成,这样当我的容器重新部署时,它会自动启动它。我试过了

RUN php /var/www/html/artisan queue:work

CMD ["php","/var/www/html/artisan","queue:work"]

ENTRYPOINT ["php","/var/www/html/artisan","queue:work"]

当然是分开的。但它们都不起作用。在 CMD 和 ENTRYPOINT 的情况下,我的容器开始发出 502 错误,并且我的服务变得无法访问。

我做错了什么?

【问题讨论】:

  • docker logs <container_name>查看日志肯定会帮助我们理解为什么容器没有启动。
  • 尝试以这种方式运行命令:CMD ["/bin/bash","-c","php","/var/www/html/artisan","queue:work && tail -f /dev/null"]
  • 您是否尝试在与其他容器相同的容器中启动工作程序?通常每个容器只启动一个进程;使用第二个容器(基于相同的图像但使用不同的命令)来启动 worker。
  • 是的,我想在同一个容器中做这两个..

标签: php laravel docker dockerfile


【解决方案1】:

您可以通过多种方式做到这一点。

您可以编写一个 shell 脚本,先启动后台进程,然后再启动您的 API。

CMD ["./start_server.sh"]

./start_server.sh的内容

#!/bin/bash

php /var/www/html/artisan queue:work &

exec php-server-serving-api

您也可以通过 docker 入口点 shell 脚本执行此操作

ENTRYPOINT ["./docker-entrypoint.sh"]
CMD ["php-server-serving-api"]

./docker-entrypoint.sh的内容

#!/bin/bash

php /var/www/html/artisan queue:work &

exec $@

但是,我建议的是,如果它们是不同类型的工作负载,请在单独的容器中运行它们。如果后台处理任务崩溃,没有人重新启动它。如果将其作为单独的容器运行,则可以使用系统重新启动它。

【讨论】:

  • 关于在单独的容器中运行它们..可以使用相同的 docker 文件来完成吗?
  • 是的,可以使用相同的 docker 文件。构建图像。当你启动容器时,传递不同的参数来启动。例如 docker run image ./start-server.shdocker run image./start-worker.sh 提供的两个脚本都在 dockerfile 中复制到映像中,以便它知道如何启动 api 和 worker
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
相关资源
最近更新 更多