在构建 dockerfile 期间无法连接到 mysql



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

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

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

ERROR 2002(HY000(:无法通过套接字'/var/lib/MySQL/MySQL.sock'连接到本地MySQL服务器(2(

这是码头文件

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命令在构建后进行,但在运行dockerrun后我得到了相同的消息。但是,如果我省略了这一步骤,并在启动后通过docker-exec手动执行,它会很好地工作。我试着做我的研究,但似乎没有人尝试做这样的事情。

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

附带说明:我不确定你想如何提供数据库被认为是最佳实践。也许值得考虑的是,将一个具有已准备好的DB状态的卷装载到容器中。

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

最新更新