我有以下yml文件:
version: '2'
services:
# another container
db:
build: ./path/to/dockerfile/
environment:
MYSQL_ROOT_PASSWORD: mypassword
MYSQL_DATABASE: database_name
MYSQL_USER: username
MYSQL_PASSWORD: mypassword
volumes:
- ./Dump.sql:/db/Dump.sql:z
- ./Dump_Test.sql:/db/Dump_Test.sql:z
- ./big_fc.sql:/db/big_fc.sql:z
ports:
- "3306:3306"
这是Docker文件:
FROM mysql:latest
LABEL maintainer "some@email.com"
RUN apt-get update -y
COPY ./solution.txt /temp/solution.txt
WORKDIR /temp
RUN cat solution.txt >> /etc/mysql/conf.d/mysql.cnf
RUN mysql -u username -pmypassword database_name -e "SOURCE /db/Dump.sql;"
但是,当我运行docker-compose up -d --build
时,我收到以下错误:
ERROR 2002(HY000):无法通过套接字'/var/run/mysqld/mysqld.sock'连接到本地MySQL服务器(2)
我尝试了this,但这不起作用,我仍然遇到同样的错误。我不明白的是,如果我省略Dockerfile的最后一行,而是运行它:
docker-compose exec db mysql -u username -pmypassword database_name -e "SOURCE /db/Dump.sql;"
它工作正常,但我想避免单独运行此行。
编辑:以下是我的Dockerfile
FROM mysql:latest
LABEL maintainer "some@email.com"
RUN apt-get update -y
COPY ./solution.txt /temp/solution.txt
WORKDIR /temp
RUN cat solution.txt >> /etc/mysql/conf.d/mysql.cnf
如果你想知道solution.txt的内容:
[mysqld]
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
答案 0 :(得分:1)
Docker有两个阶段:
问题是您尝试在构建阶段还原数据库。让我们尝试将其移至第二阶段。要实现此目的,您可以在脚本中使用数据库初始化buit。
上阅读更多内容初始化新实例 首次启动容器时,将创建具有指定名称的新数据库,并使用提供的配置变量进行初始化。此外,它将执行扩展名为.sh,.sql和.sql.gz的文件,这些文件位于/docker-entrypoint-initdb.d中。文件将按字母顺序执行。您可以通过将SQL转储装入该目录并使用提供的数据提供自定义映像来轻松填充您的mysql服务。默认情况下,SQL文件将导入到MYSQL_DATABASE变量指定的数据库中。