繁体   English   中英

如何从 docker 容器在本地系统上保存 mysql 子目录

[英]How to save mysql subdirectory on local system from a docker container

我需要从 docker mysql 容器中保存我的数据库,以便其他团队成员也可以使用它。 到目前为止,我们一直在使用它,效果很好:

    volumes:
      - ./db/:/var/lib/mysql/

但是 /db 文件夹真的很乱,因为 /mysql 文件夹包含所有 mysql 文件,而不仅仅是数据库。 所以我试图只保存数据库文件夹:

    volumes:
      - ./db/:/var/lib/mysql/database/

但不幸的是,我不断收到此错误:

[ERROR] --initialize specified but the data directory has files in it. Aborting.
[ERROR] Aborting

然而,尽管错误说明了什么,/db 文件夹是空的(也没有隐藏文件),所以我不知道错误到底是什么。

我还尝试了 /mysql 中的其他子目录并得到了相同的结果。 当我将更改恢复到-./db/:/var/lib/mysql/时,错误消失了。

完整的 docker-compose.yml:

  mysql:
    image: mysql:${MYSQL_VERSION:-latest}
    restart: always
    ports:
      - "3306:3306"
    volumes:
      - ./db/:/var/lib/mysql/${DB_NAME}
    networks:
      - backend
    environment:
      MYSQL_ROOT_PASSWORD: "${DB_ROOT_PASSWORD}"
      MYSQL_DATABASE: "${DB_NAME}"
      MYSQL_USER: "${DB_USERNAME}"
      MYSQL_PASSWORD: "${DB_PASSWORD}"
    container_name: ${PROJECT_PREFIX}_mysql

您分享的示例有几点需要注意:

  • 您正在使用的 MySQL 映像在首次up之前实际上并没有“初始化”数据库服务器(这是一种常见的做法,因为它使映像大小保持相对较小)
  • Docker 容器不会保留任何数据,除非您使用volumes明确挂载它。 因此,每次使用down / up循环时,都会将容器重置为图像的原始 state。
  • 当您循环通过down / up ,操作顺序如下:
    1. 图片原厂 state 使用
    2. 卷挂载安装在下一个
    3. 运行入口点脚本以启动容器。
  • 对于第3点的情况,如果/var/lib/mysql目录为空,MySQL 的入口点脚本将“初始化”数据库服务器,否则,它将仅从现有文件中加载它。
  • 当您挂载/var/lib/mysql时,它的工作原理是:
    • 如果目录为空,则初始化
    • 如果目录不为空,则加载 state。
  • 但是,当你挂载到/var/lib/mysql/database时,只挂载了这个目录,其他重要数据不包含在/var/lib/mysql中,因为它在原始映像中不存在。 原来缺少的其他重要数据是 MySQL 检查以验证它是否需要“初始化”数据库服务器。 由于缺少数据,它最终尝试初始化,但如果/var/lib/mysql不为空,则会引发错误(您的错误)。 在这种情况下,不为空,因为您已将database目录安装到/var/lib/mysql中。

您的选择基本上是:

  • 安装在/var/lib/mysql中并备份整个目录(确保仅在docker-compose down时进行备份!)
  • 创建您自己的 Dockerfile 并使用额外的RUN步骤来初始化 MySQL 并将其关闭,以便数据库服务器“初始化”并存储在映像中。 但是,我不建议这样做:1)您的 docker 图像大小会大得多,并且 2)此选项容易出现损坏问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM