运行Docker容器时自动启动mysql

运行Docker容器时自动启动mysql,mysql,docker,dockerfile,docker-container,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_er

我已经创建了一个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没有绝对或相对路径,就像它在你的路径中一样,是吗


您可以在start.sh的开头添加一些“echo'我实际上被调用了'>log.txt'',以检查它是否被调用。

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

从:

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

如果指定了命令,它将替换外壳。没有创建新进程。这些参数将成为命令的参数

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


我现在可以建议使用Bash解决这个问题,但所有这些(在我看来)都很混乱,很难维护。如果您想在一个容器中管理多个进程(如Apache和MySQL),我强烈建议您看看像supervisord这样的进程管理器。还有一个例子甚至使用了与您类似的用例。

我用ENTRYPOINT完成dockerfile,我给出的脚本以bash结尾。它对我有用。