【问题标题】:Can't connect to mysql during build of dockerfile [duplicate]在构建dockerfile期间无法连接到mysql [重复]
【发布时间】:2021-07-21 18:01:21
【问题描述】:

我正在尝试启动并运行一个带有 mysql 数据库的 docker 容器。我有一些额外的要求。 my.cnf中有一些属性需要修改,还有包含数据的sql文件,需要执行,这样docker容器启动后就有了所有可用的数据。

这应该在构建镜像的过程中完成,这样容器在启动后很快就准备好了,不必先插入所有数据(这是相当数量的)。

所以我的计划是,从 mysql-server 制作一个 dockerfile 并运行 sql 脚本。但是我在构建过程中无法连接到mysql,我得到了错误

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

这里是 dockerfile

FROM mysql/mysql-server:8.0

ENV MYSQL_ROOT_PASSWORD=root1234

COPY ./config/my.cnf /etc/my.cnf
COPY ./sqlfiles /mnt/sqlfiles

RUN cp -R /mnt/sqlfiles /tmp/sqlfiles
RUN sh -c "cd /tmp/sqlfiles/; gunzip *.gz"
RUN sh -c "cat /tmp/sqlfiles/*.sql | mysql -uroot -proot1234"

这里是完整的控制台输出

> docker build -t mysql-test .
[+] Building 0.5s (10/10) FINISHED
 => [internal] load build definition from Dockerfile                                                                                                             0.0s 
 => => transferring dockerfile: 32B                                                                                                                              0.0s 
 => [internal] load .dockerignore                                                                                                                                0.0s 
 => => transferring context: 2B                                                                                                                                  0.0s 
 => [internal] load metadata for docker.io/mysql/mysql-server:8.0                                                                                                0.0s 
 => [1/6] FROM docker.io/mysql/mysql-server:8.0                                                                                                                  0.0s 
 => [internal] load build context                                                                                                                                0.0s 
 => => transferring context: 321B                                                                                                                                0.0s 
 => CACHED [2/6] COPY ./config/my.cnf /etc/my.cnf                                                                                                                0.0s 
 => CACHED [3/6] COPY ./sqlfiles /mnt/sqlfiles                                                                                                                   0.0s 
 => CACHED [4/6] RUN cp -R /mnt/sqlfiles /tmp/sqlfiles                                                                                                           0.0s 
 => CACHED [5/6] RUN sh -c "cd /tmp/sqlfiles/; gunzip *.gz"                                                                                                      0.0s 
 => ERROR [6/6] RUN sh -c "cat /tmp/sqlfiles/*.sql | mysql -uroot -proot1234"                                                                                    0.3s 
------
 > [6/6] RUN sh -c "cat /tmp/sqlfiles/*.sql | mysql -uroot -proot1234":
#10 0.299 mysql: [Warning] Using a password on the command line interface can be insecure.
#10 0.303 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)
------
executor failed running [/bin/sh -c sh -c "cat /tmp/sqlfiles/*.sql | mysql -uroot -proot1234"]: exit code: 1

我也尝试在使用 CMD 命令构建后进行操作,但在运行 docker run 后我得到了相同的消息。但是如果我省略这一步,并在启动后通过 docker exec 手动执行它,它就可以正常工作了。我试图做我的研究,但似乎没有人尝试做这样的事情。

【问题讨论】:

  • 将数据库转储放在/docker-entrypoint-initdb.d 并在第一次启动时加载它是这里的标准方法。您不能在 Dockerfile 中执行此操作,因为数据库尚未运行,还因为数据库数据位于卷中并且永远不会保留在映像中。链接的问题有更多详细信息和解决方法。

标签: mysql docker dockerfile


【解决方案1】:

在构建开始之前不执行入口点/运行命令。 Dockerfile 定义了容器启动时(构建后)环境的外观。在构建时,只有环境,而不是服务器进程。

旁注:我不确定如何配置数据库被认为是最佳实践。也许值得考虑将具有准备好的数据库状态的卷安装到容器中。

编辑:应该首先启动容器,当它启动并运行时,通过docker exec 执行所需的命令(注意:exec 在这里很重要,run 将启动一个新容器并覆盖CMD指令,所以容器中不会再有正在运行的服务器进程)

【讨论】:

  • 啊,好吧,所以基本上,我想要实现的目标是不可能的?我的另一种方法是编写一个脚本,启动容器,执行上述操作,然后使用 docker image 命令制作该容器的映像,然后可以分发和使用。这至少更接近最佳实践吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 2021-12-10
  • 1970-01-01
相关资源
最近更新 更多