首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法在停靠容器内执行MariaDB操作

无法在停靠容器内执行MariaDB操作
EN

Stack Overflow用户
提问于 2017-08-16 17:57:12
回答 3查看 1.5K关注 0票数 1

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

构建和安装工作正常,但当Docker执行

代码语言:javascript
复制
RUN mysql < init.sql

要加载DB模式,我会得到

代码语言:javascript
复制
Can't connect to MySQL server (111 Connection refused)

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

代码语言:javascript
复制
docker exec -it silly_allen /bin/bash -c "mysql < init.sql" 

它工作得很好。

可能的问题是什么?

谢谢!

编辑:这是与DB相关的Dockerfile的一部分。

代码语言:javascript
复制
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
...
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-08-16 18:04:02

在我看来,您正在尝试在启动数据库之前运行mysql < init.sql。该错误显示此命令要求数据库处于运行状态。

要解决此问题,请在容器中添加一个启动脚本,其中包含:

代码语言:javascript
复制
mysqld
mysql < init.sql

并将Dockerfile CMD更改为调用此脚本。

票数 0
EN

Stack Overflow用户

发布于 2017-08-16 18:19:37

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

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

我建议您使用docker-compose将其拆分到单独的服务中,而不是拥有一个非常大的dockerfile

但是,如果你想保持原样,我建议你将ADD init.sql ...部分移到顶部,并将服务器启动部分和转储导入连接起来,因为每个RUN命令都是Docker的一个单独的层。因此,您需要类似于此StackOverflow question的答案中描述的内容

代码语言:javascript
复制
RUN /bin/bash -c "/usr/bin/mysqld_safe &" && \
  sleep 5 && \
  mysql -u root -e "CREATE DATABASE mydb" && \
  mysql -u root mydb < /root/init.sql

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

票数 2
EN

Stack Overflow用户

发布于 2017-08-18 02:34:52

这种方式是正确的:

代码语言:javascript
复制
# cat Dockerfile 
...
ADD init.sql /tmp
ADD initdb.sh /tmp
RUN /tmp/initdb.bash
CMD ["/usr/bin/mysqld_safe --datadir=/var/lib/mysql"]

和脚本:

代码语言:javascript
复制
# 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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45710469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档