无法在一个MySQL容器中转储数据库
我有以下的XML文件:
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
,我得到以下错误:
错误2002(HY000):无法通过套接字'/var/run/mysqld/mysqld.sock'连接到本地MySQL服务器(2)
我试过这个 ,这不起作用,我仍然得到相同的错误。 我不明白的是,如果我省略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
Docker有两个阶段:
- build立形象
- 从build立的图像创build和运行容器
问题是你试图在构build阶段恢复数据库。 让我们试着把它移到第二阶段。 为了达到这个目的,你可以在脚本中使用数据库初始化脚本。
初始化新实例首次启动容器时,将使用提供的configurationvariables创build并初始化具有指定名称的新数据库。 此外,它将执行在/docker-entrypoint-initdb.d中find的具有扩展名.sh,.sql和.sql.gz的文件。 文件将按字母顺序执行。 通过将SQL转储装载到该目录中并提供自定义图像和贡献数据,可以轻松地填充您的mysql服务。 SQL文件将被默认导入到由MYSQL_DATABASEvariables指定的数据库中。
你可以在mysql docker image官方页面上阅读更多内容