在 Dockerfile 中设置 MySQL 并导入转储

新手上路,请多包涵

我正在尝试为我的 LAMP 项目设置 Dockerfile,但是在启动 MySQL 时遇到了一些问题。我的 Dockerfile 上有以下几行:

 VOLUME ["/etc/mysql", "/var/lib/mysql"]
ADD dump.sql /tmp/dump.sql
RUN /usr/bin/mysqld_safe & sleep 5s
RUN mysql -u root -e "CREATE DATABASE mydb"
RUN mysql -u root mydb < /tmp/dump.sql

但我不断收到此错误:

 ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (111)

关于如何在 Dockerfile 构建期间设置数据库创建和转储导入的任何想法?

原文由 vinnylinux 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 494
2 个回答

--- 中的每个 Dockerfile RUN 指令都在不同的层中执行(如 RUN 的文档中所述)。

在您的 Dockerfile 中,您有三个 RUN 指令。问题是 MySQL 服务器只在第一次启动。在其他情况下,没有 MySQL 正在运行,这就是为什么您使用 mysql 客户端出现连接错误的原因。

要解决此问题,您有 2 个解决方案。

解决方案一:使用一行 RUN

 RUN /bin/bash -c "/usr/bin/mysqld_safe --skip-grant-tables &" && \
  sleep 5 && \
  mysql -u root -e "CREATE DATABASE mydb" && \
  mysql -u root mydb < /tmp/dump.sql

解决方案2:使用脚本

创建一个可执行脚本 init_db.sh

 #!/bin/bash
/usr/bin/mysqld_safe --skip-grant-tables &
sleep 5
mysql -u root -e "CREATE DATABASE mydb"
mysql -u root mydb < /tmp/dump.sql

将这些行添加到您的 Dockerfile

 ADD init_db.sh /tmp/init_db.sh
RUN /tmp/init_db.sh

原文由 Kuhess 发布,翻译遵循 CC BY-SA 3.0 许可协议

最新版本的官方 mysql docker 镜像 允许您在启动时导入数据。这是我的 docker-compose.yml

 data:
  build: docker/data/.
mysql:
  image: mysql
  ports:
    - "3307:3306"
  environment:
    MYSQL_ROOT_PASSWORD: 1234
  volumes:
    - ./docker/data:/docker-entrypoint-initdb.d
  volumes_from:
    - data

在这里,我的 data-dump.sql 在 docker/data 下,它与运行 docker-compose 的文件夹相关。我正在将该 sql 文件挂载到容器上的这个目录 /docker-entrypoint-initdb.d 中。

如果您有兴趣了解其工作原理,请查看 GitHub 中的 docker-entrypoint.sh 。他们添加了此块以允许导入数据

    echo
    for f in /docker-entrypoint-initdb.d/*; do
        case "$f" in
            *.sh)  echo "$0: running $f"; . "$f" ;;
            *.sql) echo "$0: running $f"; "${mysql[@]}" < "$f" && echo ;;
            *)     echo "$0: ignoring $f" ;;
        esac
        echo
    done

附加说明,如果您希望即使在 mysql 容器停止和删除后仍保留数据,则需要有一个单独的数据容器,如 docker-compose.yml 中所示。数据容器 Dockerfile 的内容非常简单。

 FROM n3ziniuka5/ubuntu-oracle-jdk:14.04-JDK8

VOLUME /var/lib/mysql

CMD ["true"]

数据容器甚至不必处于启动状态即可持久化。

原文由 Rajiv 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题