我正在尝试创建一个带有 mysql 数据库的自定义 docker 镜像。我不需要在容器运行和删除之间装载卷或保留任何数据。目标是始终以相同状态启动容器。将它们用于测试并删除它们。
采取的步骤:
从通用 mariadb 图像启动 mariadb 容器。
docker run --name some-mariadb -e MYSQL_ROOT_PASSWORD=root -d mariadb:10.1.24
1a657ebec5ba
用mysql客户端连接数据库,创建数据库,用户并授予权限。
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 容器。
创建这样的图像的正确方法是什么?
最佳答案
您的命令看起来没问题。你是如何连接到 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 调查的那样,这是由于 VOLUME 已经在 mysql/mariadb 基础镜像中定义。
您可以使用它来解决问题:
docker 文件:
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
关于mysql - 如何将 mysql 容器中的更改数据提交到新图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44848220/