我正在尝试为我们公司的一个项目创建一个 Docker 镜像,并且我不想在创建容器后手动运行 mysql 和 apache。这是我的 Dockerfile 目前的样子:
FROM php:7.4-apache
RUN apt-get update \
&& apt-get install -y default-mysql-server libzip-dev nano\
&& docker-php-ext-install zip mysqli pdo pdo_mysql \
&& docker-php-ext-enable mysqli
RUN /etc/init.d/mysql start \
&& sleep 5 \
&& mysql -u root -e "CREATE DATABASE eccube" \
&& mysqladmin -u root password 'secret'
COPY ./src_files /var/www/html
问题是,当我启动容器时,mysql进程没有运行,所以我必须进入容器并运行/etc/init.d/mysql start
。或者,我尝试在 Dockerfile 中使用 CMD 调用来启动 mysql 进程:
CMD /usr/sbin/mysqld -u mysql
但这意味着现在 Apache 服务器没有启动,我必须手动运行它。
我 sleep 太少,咖啡喝太多,所以 Docker 文档对我来说看起来像中文。有人可以解释一下如何从 Dockerfile 正确运行多个后台进程吗?
非常感谢!
最佳答案
请记住,RUN
命令在构建容器镜像时执行,而 CMD
在启动容器时运行 - 并且您只能使用一个命令。这就是为什么您只看到 MySQL 或 Apache 正在运行。
您查看过Docker Compose吗? ?这将允许您在一个容器中运行数据库,在另一个容器中运行 Apache 服务器,并使用 docker-compose up 轻松启动这两个容器。
如果您确实想将所有内容放入一个容器中,您仍然可以这样做;您可以考虑使用单个 Bash 脚本来启动这两个脚本。您可以将该 Bash 脚本添加到 Docker 构建过程中,然后设置 CMD 来运行该脚本,而不是仅启动 MySQL 或 Apache。 Docker 文档有一些示例 here了解如何设置具有多个服务的单个容器。
我个人认为您想要做的事情最好使用 Docker Compose 来完成,这样您就可以分离您的关注点,但我不知道您的应用程序的详细信息。
关于docker - 如何从我的 Dockerfile 运行 Mysql 和 Apache?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65090321/