在Docker容器

时间:2017-08-16 09:57:12

标签: mysql docker containers mariadb

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

构建和安装工作正常,但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" 

它运作得很好。

可能是什么问题?

谢谢!

编辑:这是与DB相关的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
...

3 个答案:

答案 0 :(得分:2)

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

此外,还有一个官方mariadb image,允许您将目录挂载为卷,可以包含SQL转储。这些转储是在创建容器时自动导入的,因此这可能很方便。

我建议不要使用一个非常大的dockerfile,而是在docker-compose

的单独服务中拆分它

如果您确实希望保持这种状态,我建议您将ADD init.sql ...部分移到顶部,并连接服务器启动部分和转储导入,因为每个{{1 command是与Docker的单独层。所以你需要像StackOverflow question的答案中所描述的那样:

RUN

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

答案 1 :(得分:0)

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

要解决此问题,请将启动脚本添加到包含以下内容的容器中:

mysqld
mysql < init.sql

并更改您的Dockerfile CMD以调用此脚本。

答案 2 :(得分:0)

这种方式是对的:

# 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

脚本:

originalArray = [
  {
    product: { price: 10},
    shipping: {...}
  },
  {
    product: {price: 20},
    shipping: {...},
  }
]