我需要在现有的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
...
答案 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: {...},
}
]