运行Docker容器时自动启动mysql

时间:2017-04-14 08:12:15

标签: 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,一切正常。

知道我做错了什么?

2 个答案:

答案 0 :(得分:1)

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

来自man page

  

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

     

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

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

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

答案 1 :(得分:0)

start.sh没有绝对或相对路径,就像它在你的PATH中一样,是吗?

你可以添加一些" echo'我实际上被称为' > log.txt的"在start.sh的开头检查它是否被调用。