首页 > 解决方案 > 如何从我的 Dockerfile 运行 Mysql 和 Apache?

问题描述

我正在尝试为我们公司的一个项目创建一个 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 服务器没有启动,我必须手动运行它。

我睡得太少,喝了太多咖啡,所以 Docker 文档在我看来就像中文。有人可以解释如何从 Dockerfile 正确运行多个后台进程吗?

非常感谢!

标签: dockercmddockerfileforeground

解决方案


请记住,这些RUN命令在构建容器映像时执行,而CMD在容器启动时运行 - 您只能拥有一个命令。这就是为什么您只看到 MySQL 或 Apache 在运行的原因。

你看过Docker Compose吗?这将允许您在一个容器中运行您的数据库并在另一个容器中运行您的 Apache 服务器,并且可以轻松地使用docker-compose up.

如果您确实想将所有内容放在一个容器中,您仍然可以这样做;您可能会考虑使用单个 Bash 脚本来启动两者。您可以将该 Bash 脚本添加到您的 Docker 构建过程中,然后设置CMD为运行该脚本,而不是仅启动 MySQL 或仅启动 Apache。Docker 文档在此处提供了一些示例,说明如何设置具有多个服务的单个容器。

我个人认为你想要做的最好是使用 Docker Compose 来完成,这样你就可以分离你的关注点,但我不知道你的应用程序的细节。


推荐阅读