我在docker容器中运行MySQL:
sudo docker run --rm --name mysql5 --net legacy_net --net-alias mysql5 --ip 172.20.0.2 -e MYSQL_ROOT_PASSWORD=$MROOTPASS -d mysql:5.7
mysql -u root -h 172.20.0.2 -p$MROOTPASS
并使用以下命令创建了一个实验数据库:
CREATE DATABASE testdb;
并提交了容器:
sudo docker commit mysql5 mysql:5.7-test
当我启动已提交的容器时:
sudo docker stop mysql5;
sudo docker run --rm --name mysql5 --net legacy_net --net-alias mysql5 --ip 172.20.0.2 -e MYSQL_ROOT_PASSWORD=$MROOTPASS -d mysql:5.7-test
我的测试数据库消失了。
这是正常行为还是我做错了什么?
我的理解是,Docker 将其数据存储在其内部存储的某个位置,当我执行此操作时,该数据会被复制到新映像中docker commit
。我误解了什么?
编辑1
sudo docker inspect mysql5 | grep -i volume
"VolumeDriver": "",
"VolumesFrom": null,
"Type": "volume",
"Source": "/var/lib/docker/volumes/1f04f07e91a16e6e9aeb393af2954dd7e32e2a2b93615fb4b6924de3568951af/_data",
"Volumes": {
sudo docker inspect mysql:5.7
"Volumes": {
"/var/lib/mysql": {}
},
编辑2
mysql
Docker使用 id=999 的用户创建卷:
sudo docker run --rm --name mysql5 -v /home/dmitriano/work/mysql:/var/lib/mysql --net legacy_net --net-alias mysql5 --ip 172.20.0.2 -e MYSQL_ROOT_PASSWORD=$MROOTPASS -d mysql:5.7
ll
drwxr-xr-x 5 999 root 4096 Jan 20 19:31 mysql/
sudo docker exec -it mysql5 bash -c "id 999"
uid=999(mysql) gid=999(mysql) groups=999(mysql)
我应该在主机上用这个 999 做什么?
根据您关于将数据库重置为附加状态的评论,可以很清楚地了解您的期望。
您想在 MySQL 容器内设置一个测试数据库,并想在测试后重置该数据库。
这
docker commit
不是正确的位置,因为数据库不是容器的一部分,而是卷的一部分,该卷在 MySQL Dockerfile 中定义。除非您制作自己的 Docker 映像而不使用这个指令,否则提交此容器不会存储测试数据库。有两个选择。
选项 1 是定义一个命名卷并将 fe 安装
/test
到/var/lib/mysql
正在运行的容器内。初始设置后,您可以将该文件夹复制到保存位置,然后在运行下一个测试周期之前将其复制回 ´/test` 等。快速而粗略...选项 2 是使用 MySQL docker 内部初始化过程。容器内有一个众所周知的文件夹
/docker-entrypoint-initdb.d/
。该文件夹默认为空,但可能包含几个用于初始化数据库的 SQL 文件。因此,只需安装/schema.sql
到/docker-entrypoint-initdb.d/schema.sql
即可。此外 - 当然 - 您还可以基于公共 MySQL docker 镜像定义自己的 MySQL 容器,并通过将该模式文件 COPY 到给定位置来扩展 Dockerfile,或者添加几个 RUN 命令来创建已完全定义的镜像。
您的问题 - 哪里出了问题 - 您运行容器,
docker run --rm
并在停止后删除该卷。请检查位置(根据您的示例/var/lib/docker/volumes/1f04f07e91a16e6e9aeb393af...
)之后不应再存在docker stop
。