使用Dockerfile设置MySQL

时间:2016-09-06 15:21:06

标签: mysql docker dockerfile

我刚开始使用Docker并能够根据我的需要设置MySQL,运行tutum / lamp并做一堆exec。例如:

docker run -d -p 80:80 -p 3306:3306 --name test tutum/lamp
...
docker exec test mysqldump --host somehost --user someuser --password --databases somedatabase > dump.sql
docker exec test mysql -u root < dump.sql

但是,我在将此转换为Dockerfile时遇到问题。具体而言,以下结果为ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'

FROM tutum/lamp
EXPOSE 80 3306
...
RUN mysqldump --host=$DB_IP --user=$DB_USER --password=$DB_PASSWORD --databases somedatabase > dump.sql
RUN mysql -u root < dump.sql

1 个答案:

答案 0 :(得分:4)

为了做到这一点,你需要覆盖run.sh,因为当你运行容器时,它将首次安装mysql。 这就是为什么你之前无法连接到mysql的原因(在我之前的回答中我并没有意识到这一点)。

我通过将其添加到Dockerfile

来设法执行mysql命令
FROM tutum/lamp
ADD . /custom
RUN chmod 755 /custom/run.sh
CMD ["/custom/run.sh"]

然后在同一文件夹中创建一个文件run.sh

#!/bin/bash

VOLUME_HOME="/var/lib/mysql"

sed -ri -e "s/^upload_max_filesize.*/upload_max_filesize = ${PHP_UPLOAD_MAX_FILESIZE}/" \
-e "s/^post_max_size.*/post_max_size = ${PHP_POST_MAX_SIZE}/" /etc/php5/apache2/php.ini
if [[ ! -d $VOLUME_HOME/mysql ]]; then
    echo "=> An empty or uninitialized MySQL volume is detected in $VOLUME_HOME"
    echo "=> Installing MySQL ..."
    mysql_install_db > /dev/null 2>&1
    echo "=> Done!"
    /create_mysql_admin_user.sh
else
    echo "=> Using an existing volume of MySQL"
fi

( sleep 20 ; mysql -u root < /custom/dump.sql ; echo "*** IMPORT ***"  ) &

exec supervisord -n

此文件与/run.sh相同,在20秒后添加了一行以运行sql import以确保mysql服务已启动并运行(必须有更优雅的方式在mysql启动后运行命令,当然)。