mysql - 运行Docker容器时自动启动mysql

标签 mysql docker dockerfile docker-container

我创建了一个 Dockerfile,以便在我的计算机上拥有一个包含 php7、mysql 和其他一些库的开发环境。

运行容器时,apache 服务会自动启动,但我无法使用 mysql 获得相同的结果。我的 Dockerfile 的最后一句看起来像这样 CMD ["bash", "run.sh"] ,然后在 run.sh 中我有这个:

#!/bin/bash
set -e

PHP_ERROR_REPORTING=${PHP_ERROR_REPORTING:-"E_ALL"}
sed -ri 's/^display_errors\s*=\s*Off/display_errors = On/g' /etc/php/7.0/apache2/php.ini
sed -ri 's/^display_errors\s*=\s*Off/display_errors = On/g' /etc/php/7.0/cli/php.ini
sed -ri "s/^error_reporting\s*=.*$//g" /etc/php/7.0/apache2/php.ini
sed -ri "s/^error_reporting\s*=.*$//g" /etc/php/7.0/cli/php.ini
echo "error_reporting = $PHP_ERROR_REPORTING" >> /etc/php/7.0/apache2/php.ini
echo "error_reporting = $PHP_ERROR_REPORTING" >> /etc/php/7.0/cli/php.ini

source /etc/apache2/envvars && exec /usr/sbin/apache2 -DFOREGROUND

chmod 0755 start.sh
sleep 1
start.sh

/bin/bash

这会调用一个名为 start.sh 的文件,如下所示:

#!/usr/bin/env bash

# Mysql
sed -i -e 's/127.0.0.1/0.0.0.0/g' /etc/mysql/mysql.conf.d/mysqld.cnf
service mysql start

它分为两个文件,因为我测试了所有内容,但无法使其工作。如果我在容器内执行 docker exec 并启动 mysql,一切都会正常工作。

知道我做错了什么吗?

最佳答案

您正在 run.sh 脚本中相对较早地运行 exec/usr/sbin/apache2 -DFOREGROUNDexec 的特点是它不会启动 shell 的子进程,而是用新进程替换 shell。

来自man page :

exec [-cl] [-a name] [command [arguments]]

If command is specified, it replaces the shell. No new process is created. The arguments become the arguments to command.

这意味着您的 shell 脚本在调用 exec 后将不会继续运行。

我现在可以建议多种方法来使用 Bash 解决这个问题,但所有这些(在我看来)都会很困惑且难以维护。如果您想管理一个容器内的多个进程(例如 Apache 和 MySQL),我强烈建议您查看一下进程管理器,例如 supervisord。有一个excellent article in the official documentation甚至使用与您类似的用例作为示例。

关于mysql - 运行Docker容器时自动启动mysql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43407740/

相关文章:

php - textarea 不提交到数据库

php - 对非对象调用成员函数 fetch_assoc()。 mysql

php - CakePHP 3 按关键字分组按页面查找

php - 在执行员工搜索之前我收到以下错误

docker - 如何从主机检查docker容器中是否存在文件夹

docker - 带有Docker和NPM的Gitlab CI

docker - 部署到 Docker 时外部化 Spring Boot 属性

php - super 慢的Docker构建

docker - 如何从 LDAP 容器中删除用户

带有 GUI 参数的 Dockerfile、groupadd