提问者:小点点

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


我正在尝试创建一个自定义的docker映像,里面有mysql数据库。我不需要在容器运行和删除之间挂载卷或持久化任何数据。目标是始终以相同的状态启动容器。将它们用于测试并将其删除。

采取的步骤:

从一般的mariadb映像启动mariadb容器。

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

用mysql客户端连接到db创建一个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提交1A657EBEC5BA my-registry/store-test-db:2017-06-30-15-26

现在,当我从另一个主机上的这个映像启动一个容器时。它只是一个简单的mysql容器,没有我的用户或数据库。

怎样塑造这样的形象才是正确的方法?


共1个答案

匿名用户

你的命令看起来没问题。如何连接到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基映像中已经定义的卷。

您可以使用此方法解决此问题:

DockerFile:

FROM mariadb:10.1.24

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

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

生成与运行:

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