如何将mysql容器中已更改的数据提交到新映像

时间:2017-06-30 13:55:06

标签: mysql docker

我正在尝试使用mysql数据库创建自定义docker镜像。我不需要在容器运行和删除之间安装卷或保留任何数据。目标是始终以相同的状态启动容器。使用它们进行测试并将其删除。

采取的步骤:

从通用mariadb图像启动mariadb容器。

docker run --name some-mariadb -e MYSQL_ROOT_PASSWORD=root -d mariadb:10.1.24
1a657ebec5ba

使用mysql客户端连接到db以创建数据库,用户和授予权限。

mysql -uroot -proot -h 0.0.0.0

mysql> CREATE DATABASE store

mysql> CREATE USER 'store'@'%' IDENTIFIED BY 'store';

mysql> GRANT ALL ON store.* TO 'store'@'%';

mysql> exit

导入数据。

mysql -ustore -pstore -h 0.0.0.0 store < ~/mysqldumps/store-2017-06-22-13-55.sql

此时,容器具有所需的用户,权限,数据和数据库。

致力于新形象。

docker commit 1a657ebec5ba my-registry/store-test-db:2017-06-30-15-26

现在,当我从另一台主机上的此图像启动容器时。它只是一个没有我的用户或数据库的普通mysql容器。

创建此类图像的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

您的命令看起来不错。你是如何连接到mysql容器的?您似乎正在使用主机mysql而不是容器中运行的mysql。添加端口映射配置:

所以,运行如下:

docker run -p 3307:3306 --name some-mariadb -e MYSQL_ROOT_PASSWORD=root -d mariadb:10.1.24

然后将其连接到容器mysql:

mysql -P 3307 -h 127.0.0.1 -uroot -proot

或者,您可以使用docker exec

访问mysql终端
docker exec -it <container-id> mysql -uroot -proot
mysql> 

修改

正如@raitisd调查的那样,这是由于已经在mysql / mariadb基本映像中定义的VOLUME。

您可以使用它来解决问题:

Dockerfile:

FROM mariadb:10.1.24

RUN cp -r /var/lib/mysql /var/lib/mysql-no-volume

CMD ["--datadir", "/var/lib/mysql-no-volume"]

Build&amp;运行:

docker build . -t my-mariadb
docker run -e MYSQL_ROOT_PASSWORD=root -it my-mariadb