不能在docker集装箱MariaDB

我需要在现有的Docker容器中运行MariaDB。

build设和安装工作很好,但是当Docker执行

RUN mysql < init.sql 

加载我得到的数据库模式

 Can't connect to MySQL server (111 Connection refused) 

但是,当我运行容器并执行

 docker exec -it silly_allen /bin/bash -c "mysql < init.sql" 

它工作得很好。

可能是什么问题?

谢谢!

编辑:这是与数据库相关的Dockerfile的一部分。

 FROM centos:7 WORKDIR /root ... RUN echo "[mariadb]" >> /etc/yum.repos.d/MariaDB.repo RUN echo "name = MariaDB" >> /etc/yum.repos.d/MariaDB.repo RUN echo "baseurl = http://yum.mariadb.org/10.1/centos7-amd64" >> /etc/yum.repos.d/MariaDB.repo RUN echo "gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB" >> /etc/yum.repos.d/MariaDB.repo RUN echo "gpgcheck=1" >> /etc/yum.repos.d/MariaDB.repo RUN rpm --import https://yum.mariadb.org/RPM-GPG-KEY-MariaDB RUN yum install -y MariaDB-server MariaDB-client RUN yum clean all RUN echo "[mysqld]" > /etc/my.cnf RUN echo "bind-address=0.0.0.0" >> /etc/my.cnf RUN /etc/init.d/mysql restart ADD init.sql /root RUN mysql < /root/init.sql ... 

从我所看到的,你正在试图在启动数据库之前运行mysql < init.sql 。 该错误显示此命令需要数据库正在运行。

为了解决这个问题,在你的容器中添加一个启动脚本包含:

 mysqld mysql < init.sql 

并改变你的Dockerfile CMD来调用这个脚本。

根据Docker的最佳实践,您应该为每个进程运行一个容器。

此外,还有一个官方mariadb图像 ,它允许您挂载一个目录作为卷,可能包含SQL转储。 这些转储在创build容器时自动导入,所以这可能会很方便。

我会build议,而不是有一个非常大的docker文件,你把它分解成不同的服务与docker-compose

如果你想保持这种方式,我build议你将ADD init.sql ...部分移到顶端,并连接服务器启动部分和转储导入,因为每个RUN命令是与Docker分离的层。 所以你需要像这个StackOverflow问题的答案中描述的东西:

 RUN /bin/bash -c "/usr/bin/mysqld_safe &" && \ sleep 5 && \ mysql -u root -e "CREATE DATABASE mydb" && \ mysql -u root mydb < /root/init.sql 

以便服务器初始化并将转储导入到一个图层中

这样是对的:

 # cat Dockerfile ... ADD init.sql /tmp ADD initdb.sh /tmp RUN /tmp/initdb.bash CMD ["/usr/bin/mysqld_safe --datadir=/var/lib/mysql"] 

和脚本:

 # cat dump/initdb.bash #!/bin/bash set -e set -x mysqld_safe --datadir='/var/lib/mysql' --user=root & until mysqladmin ping >/dev/null 2>&1; do sleep 0.2 done mysql -e 'create database init;' && \ mysql init < /tmp/init.sql && \ echo "Successfully imported" && exit 0