docker - 如何从我的 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 正确运行多个后台进程吗?
非常感谢!
解决方案
请记住,这些RUN
命令在构建容器映像时执行,而CMD
在容器启动时运行 - 您只能拥有一个命令。这就是为什么您只看到 MySQL 或 Apache 在运行的原因。
你看过Docker Compose吗?这将允许您在一个容器中运行您的数据库并在另一个容器中运行您的 Apache 服务器,并且可以轻松地使用docker-compose up
.
如果您确实想将所有内容放在一个容器中,您仍然可以这样做;您可能会考虑使用单个 Bash 脚本来启动两者。您可以将该 Bash 脚本添加到您的 Docker 构建过程中,然后设置CMD
为运行该脚本,而不是仅启动 MySQL 或仅启动 Apache。Docker 文档在此处提供了一些示例,说明如何设置具有多个服务的单个容器。
我个人认为你想要做的最好是使用 Docker Compose 来完成,这样你就可以分离你的关注点,但我不知道你的应用程序的细节。
推荐阅读
- javascript - 无法更改 this.state 属性:无法读取未定义的属性“setState”
- angular - 有人可以用 Angular 形式解释我的这种语法吗#name="ngModel"
- c# - 将彩色非 ASCII 字符打印到 CLI
- monitoring - 使用 java datadog 代理发送 KafkaStreams jmx 指标
- python - 照片转换 2d 黑白到 3d rgb 照片
- spring-boot - 是否对 Integer 字段进行任何验证以检查 rest api 的确切值?@Min 和 @Max 不起作用
- reactjs - 无法在测试中访问 IonInput 值
- javascript - 链接内的单独值
- python - 如何自动替换在 QtPlainTextEdit 小部件中键入的字符
- ios - SwiftUI:有没有办法向 Menu() 添加自定义按钮样式?