【发布时间】: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