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

标签 mysql docker

我正在尝试创建一个带有 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/

相关文章:

django - 使用 exec (shell) 运行 Docker 后以非 root 身份运行命令

java - Docker - 在 Java 应用程序中获取绑定(bind)端口

mysql - org.apache.tomcat.jdbc.pool.ConnectionPool 放弃

php - MySQL 按日期时间字段排序,如果存在相同日期,则使用 Rand()

mysql - 想要连接具有多个条件的多个表

python - 在数据库查询中使用占位符不起作用

node.js - 构建 Dockerfile - 在中间容器之间保留文件

angularjs - 使用GitLab CI通过ftp部署应用

docker - 将现有容器从 Hyper-V 迁移到 WSL2 技术

java - 使用netbeans、使用PreparedStatement和ResultSet从MYSql检索数据