首页 > 解决方案 > 在 docker-compose 中使用卷时,Mariadb 表被删除

问题描述

我正在复制以前的 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 映像时,所有表都保留了

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

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

标签: mysqldockermariadb

解决方案


您的问题与 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 可以升级/降级你的版本并导致各种有趣的错误。


推荐阅读