mysql - 在 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 。
如何使用卷获取数据库的数据?
解决方案
您的问题与 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 可以升级/降级你的版本并导致各种有趣的错误。
推荐阅读
- python - 我如何在 tkinter 中创建一个按钮将显示页面更新为其他内容
- c++ - 如何在 C++ 11 中使用小时分钟和秒查找两个日期之间的持续时间?
- java - 使用参数化构造函数(带有必填字段)和设置器,而不是使用构建器设计模式
- javascript - 难以通过网络蓝牙连接热敏打印机
- javascript - 如何显示条件内容(通过在 React.JS 中使用 Link、Route)
- javascript - Gatsby 3rd 方脚本未按预期工作
- python - Python,使用线程和调度来不断运行一个函数
- c# - 我做了一个浏览器。但是当我按下最大化按钮时,表单的组件是默认大小。我该如何解决?
- json - 在 Golang 中将字符串解组为类似结构的结构
- sql - 查找前 5 位名人