【问题标题】:Mariadb tables are deleted when use volume in docker-compose在 docker-compose 中使用卷时,Mariadb 表被删除
【发布时间】:2021-06-01 20:21:09
【问题描述】:

我正在复制以前的 mariadb 容器的数据(/var/lib/mysql)并将数据粘贴到新的容器映像中。 这是 Dockerfile

FROM mariadb:latest

ENV MYSQL_ROOT_PASSWORD tt
ENV MYSQL_DATABASE tt
ENV MYSQL_USER tt
ENV MYSQL_PASSWORD tt

# copy other database data
ADD mysql /var/lib/mysql
RUN chown -R mysql:mysql /var/lib/mysql

VOLUME /var/lib/mysql

EXPOSE 3306

CMD ["mysqld"]

当我构建 docker 镜像时,所有表都保留了

但是使用volume运行docker镜像,所有表都消失了,只剩下db.opt。

如何使用volume获取数据库的数据?

【问题讨论】:

    标签: mysql docker mariadb


    【解决方案1】:

    您的问题与 VOLUMES 的工作方式有关,您正在执行的操作是在构建时在 /var/lib/mysql 中添加内容,然后当您运行容器时,会创建一个新的 EMPTY VOLUME 并将其链接到 /var /lib/mysql,它几乎会覆盖你之前放在那里的任何东西。

    对现有表空间进行处理的正确方法是使用docker volume create 语法(参考:https://docs.docker.com/storage/volumes/)创建一个卷,然后使用此技巧(https://github.com/moby/moby/issues/25245#issuecomment-365980572)添加表数据到你的卷,然后你运行你的 mariadb 容器安装说卷 docker run --mount source=myvolume,target=/var/lib/mysql mariadb:latest

    我要补充一点,您不应该使用在 docker 构建层添加的表来构建镜像,这会使 docker 镜像变得巨大,并且除了某些特殊情况(例如您破坏的 QA 数据库)外,它的使用都是错误的之后或只读数据库。通常的方法是使用您所说的 VOLUMES 或使用来自主机操作系统的绑定。

    那么,你也不应该使用 mariadb:latest,选择一个特定的版本并坚持使用它,因为使用 mariadb:latest 可以升级/降级你的版本并导致各种有趣的错误。

    【讨论】:

    • 谢谢!那么当通过docker-compose部署包括mariadb的服务时,我应该使用单独的方式(例如github)分发db数据吗?
    • 通常 DB 数据不存储在 Docker 镜像或 Github 中。大多数情况下,它存储在托管数据库的任何计算机中,您将备份上传到某种对象存储(如 S3 或 GCS),然后您可以从这些备份中将数据分发到其他主机。
    猜你喜欢
    • 2020-02-06
    • 2018-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 2021-08-19
    • 2021-09-27
    • 1970-01-01
    相关资源
    最近更新 更多