运行Docker容器时自动启动mysql

我创build了一个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 

它分成两个文件,因为我testing了一切,但我无法得到它的工作。 如果我在容器内执行docker exec,并启动mysql,一切正常。

任何想法我做错了什么?

您在run.sh脚本的早期运行exec /usr/sbin/apache2 -DFOREGROUND 。 关于exec的一点是,它并不启动shell的subprocess,而是用一个新进程来replace shell。

从手册页 :

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

如果指定了命令,则会replace该shell。 没有新的进程被创build。 论据成为命令的论据。

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

我现在可以提出一些用Bash来解决这个问题的方法,但是所有这些方法(在我看来)是混乱的,难以维护的。 如果你想在一个容器(如Apache和MySQL)中pipe理多个进程,我强烈build议看一下像supervisord这样的进程pipe理器。 官方文档中还有一篇很好的文章 ,甚至使用类似的用例作为例子。

start.sh没有绝对path或相对path,就像是在PATH里一样,是吗?

你可以在start.sh的开头添加一些“echo”我实际上叫做“> log.txt”来检查它是否被调用。