当 运行 一个 Docker 容器时自动启动 mysql
Start mysql automatically when running a 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 一切正常。
知道我做错了什么吗?
start.sh 没有绝对或相对路径,就像它在您的 PATH 中一样,是吗?
您可以在 start.sh 的开头添加一些 "echo 'I am actually called' > log.txt" 以检查它是否被调用。
您是 运行 exec /usr/sbin/apache2 -DFOREGROUND
相对较早的 run.sh
脚本。关于 exec
的事情是它不会启动 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 甚至使用了与您类似的用例作为示例。
我已经创建了一个 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 一切正常。
知道我做错了什么吗?
start.sh 没有绝对或相对路径,就像它在您的 PATH 中一样,是吗?
您可以在 start.sh 的开头添加一些 "echo 'I am actually called' > log.txt" 以检查它是否被调用。
您是 运行 exec /usr/sbin/apache2 -DFOREGROUND
相对较早的 run.sh
脚本。关于 exec
的事情是它不会启动 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 甚至使用了与您类似的用例作为示例。