docker - 如何从我的 Dockerfile 运行 Mysql 和 Apache?

标签 docker cmd dockerfile foreground

我正在尝试为我们公司的一个项目创建一个 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/

相关文章:

docker - stub.GetHistoryKeys() 报告 GetHistoryKeys() 函数未定义。当尝试在我的 Chaincode 上构建时

docker swarm init 无法选择 IP 地址错误

command-line - 如何从批处理脚本中运行批处理脚本?

windows - 从 cmd 脚本如何查找它是从 cmd 控制台调用还是通过单击资源管理器调用

docker - 无法在代理后面下载Docker镜像:超时:适用于Mac的Docker

docker - 客户端比服务器新(客户端 API 版本 : 1. 24,服务器 API 版本 : 1. 21)

docker - "docker-compose.yml"的路径作为参数

Windows 批处理文件 : set string+number variables to contents of cmd-line parameters?

ubuntu - ubuntu20.04 docker容器中NVIDIA cuDNN安装

shell - "Exec format error"docker 运行命令