【问题标题】:DOCKERFILE: Running multiple CMD. (Starting NGINX and PHP) [duplicate]DOCKERFILE:运行多个 CMD。 (启动 NGINX 和 PHP)[重复]
【发布时间】:2018-04-06 21:36:40
【问题描述】:

我有一个设置 NGINX、PHP 的 dockerfile,添加了一个 Wordpress 存储库。我想在启动时启动 PHP 和 NGINX。但是,我没有这样做。我尝试在 CMD 数组中添加这两个命令,还尝试将它们放入 shell 文件并启动 shell 文件。没有任何效果。下面是我的 Dockerfile

FROM ubuntu:16.04

WORKDIR /opt/

#Install nginx
RUN apt-get update
RUN apt-get install -y nginx=1.10.* php7.0 php7.0-fpm php7.0-mysql

#Add the customized NGINX configuration
RUN rm -f /etc/nginx/nginx.conf
RUN rm -f /etc/nginx/sites-enabled/*

COPY nginx/nginx.conf /etc/nginx/
COPY nginx/site.conf /etc/nginx/sites-enabled

#Copy the certificates
RUN mkdir -p /etc/pki/nginx
COPY nginx/certs/* /etc/pki/nginx/
RUN rm -f /etc/pki/nginx/placeholder

#Copy the build to its destination on the server
RUN mkdir -p /mnt/wordpress-blog/
COPY . /mnt/wordpress-blog/

#COPY wp-config.php
COPY nginx/wp-config.php /mnt/wordpress-blog/

#The command to run the container
CMD ["/bin/bash", "-c", "service php7.0-fpm start", "service nginx start"]

我尝试将 CMD 中的命令放在 shell 文件中,并在 CMD 命令中运行 shell 文件。它仍然没有工作。我错过了什么?

【问题讨论】:

标签: php docker nginx dockerfile


【解决方案1】:

start.sh

#!/bin/bash

/usr/sbin/service php7.0-fpm start
/usr/sbin/service nginx start
tail -f /dev/null

Dockerfile

COPY ["start.sh", "/root/start.sh"]
WORKDIR /root
CMD ["./start.sh"]

有了这个,你可以把更复杂的逻辑放到start.sh中。

【讨论】:

  • 这是反模式。你不应该建议人们使用它。并且它可能会导致整个系统崩溃,因为您建议运行无限循环!
  • 我同意你的看法,那么tail -f /dev/null呢?
  • 它可能会起作用。但仍然不是最佳做法。因为当您的依赖项之一失败时-例如nginx-您将不知道。容器不会重新启动。所以这与 dockerization 背后的想法背道而驰。
  • 不,我们可以在这里做更复杂的逻辑。在tail -f /dev/null之前,你可以做任何逻辑,也许是看nginx是否ok,返回码是否ok,80端口是否开放,随你喜欢。不行的话可以直接退出1。顺便说一句,idea behind the dockerization?是什么@
  • 是的,你可以。但是,如果您的检查后应用程序失败怎么办?繁荣 - 你注定要失败。码头化背后的想法是每个容器的单一责任。非常适合、优化和包装单一职责的容器。如果您将依赖项紧密耦合,您将在单独管理、监控和更新流程时遇到更多麻烦。我什至没有提到扩展应用程序。
【解决方案2】:

您可以将 CMD 行替换为...

CMD ["/bin/bash", "-c", "/usr/sbin/service php7.0-fpm start && nginx -g 'daemon off;'"]

【讨论】:

【解决方案3】:

TL;DR:您没有入口点。

Docker 的主要思想是每个容器都有一个职责。因此,为了继续运行 Docker 容器,您必须在容器启动时在前台启动一个程序。

但是,在您的 Dockerfile 中,没有在前台启动程序的入口点。所以,在你的容器启动之后,你的容器就会退出。

所以,为了防止你的容器退出,只需在前台启动一个程序即可。

以 Nginx 为例。

示例场景:

entrypoint.sh 内容:

#!/bin/bash
service php7.0-fpm start
nginx -g 'daemon off;

Dockerfile 中的某处:

COPY [ "./entrypoint.sh", "/root/entrypoint.sh" ]

在 Dockerfile 的末尾:

ENTRYPOINT /root/entrypoint.sh

【讨论】:

  • 我照你说的做了。这完全有道理。但是,当我执行到容器中时,NGINX 正在运行,而 php-fpm 没有。我希望 php-fpm 在容器启动时运行
  • 我没有测试但是可能这条指令有问题:CMD ["/bin/bash", "-c", "service php7.0-fpm start"]跨度>
  • 解决方法不对,如果CMD和ENTRYPOINT都指定了,CMD会作为ENTRYPOINT的参数,所以php永远不会运行。建议看看 docker 官方指南 :)
  • 好收获。我实际上从未在 Dockerfile 中指定入口点。我在撰写文件中使用它。 OP 可以尝试使用 RUN instruct 代替。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
相关资源
最近更新 更多