当前位置: 首页 > 知识库问答 >
问题:

在生成dockerfile[重复]期间无法连接到mysql

丌官嘉福
2023-03-14

我正在尝试使用mysql数据库启动并运行一个docker容器。我有一些额外的要求。在my.cnf中有一些属性需要更改,并且有一些包含数据的sql文件应该执行,以便启动后的docker容器拥有所有可用的数据。

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

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

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手动执行它,它就会正常工作。我试图做我的研究,但似乎没有人试图做这样的事情。

共有1个答案

司空健
2023-03-14

在生成开始之前不执行entrypoint/run命令。Dockerfile定义了容器启动时(构建后)环境的样子。在构建期间,只有环境,而不是服务器进程。

侧注:我不确定您想要提供db的方式是否被认为是最佳实践。也许值得考虑将一个具有prepared DB状态的卷装入容器中。

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

 类似资料:
  • 我有数据存储在mysql数据库,我想把它拉到我的程序,这是使用javafx,但它不会工作。如果我用一些不使用javafx的基本类提取数据,它工作得很好。但是,使用javafx,我会得到以下错误消息。我该怎么做才能解决这个问题? 很抱歉这个问题太长了。

  • 我编写了一些代码来在本地数据库中插入一个表,但我在堆栈跟踪中得到以下错误: 显然,我可能是错的,但这与我的时区或时区在MySQL或JDBC连接器中的设置方式有关。 这里是我的原始源代码:

  • sry如果这个问题是noob(我是新来的)。。。 我一直试图设置我的应用程序连接到数据库,但我得到了这个错误,我似乎找不到问题。 这是密码 当我试着运行nodemon并打开http://localhost:3000/

  • 可能重复: Eclipse无法在windows 7上连接oracle 10g XE 当我尝试测试连接时,我遇到了这个错误。。 java.sql.SQLException: Io异常:网络适配器无法建立连接" 现在该怎么办?我也从网站下载了ojdbc14.jar,但我仍然收到这个错误。

  • 我在一个服务器上安装了MySQL server,并进行了dockerized项目,数据库是不能公开访问的,只能从服务器内部访问。它也被本地的非dockerized应用程序使用。我想从docker内部连接到它,但它仍然不能公开访问,我尝试了172.17.0.1,但我的连接被拒绝。当前的bind_address是127.0.0.1,您建议bind_address是什么?

  • 我编写了一些逻辑,同时表示与exchange的近200个websocet连接。我使用第三方api,它基于org.eclipse.jetty.webSocket.api。我有一个我必须重写的方法。 我在stackoverflow上找到了这个问题,但我看不到清晰的答案。请帮忙,提前谢谢。