当前位置: 首页 > 知识库问答 >
问题:

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

万俟小林
2023-03-14

我正在尝试创建一个自定义的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个答案

汪欣德
2023-03-14

你的命令看起来没问题。如何连接到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
 类似资料:
  • 我使用官方支持的mysql映像创建了一个mysql容器。我运行映像,挂载一个包含sql转储的文件夹,然后在容器中创建一个新数据库,并在其中导入.sql转储: 然后列出正在运行的容器以获取该容器的ID: 然后,我将容器(带有导入的sql)提交为新的容器映像 但是,如果我使用新映像启动容器,则mysql数据库不包含新创建的数据库liferay_psat1。 我做错了什么? 谢谢你的帮助!

  • 问题内容: 我使用正式支持的mysql映像创建了mysql容器。我运行了映像,安装了一个包含sql dump的文件夹,然后在容器中创建了一个新数据库,并在其中导入了.sql dump: 然后,我列出了正在运行的容器以获取该容器的ID: 然后,我将容器(与导入的sql一起)提交为新的容器映像 但是,如果我使用该新映像启动容器,则mysql数据库不包含新创建的数据库liferay_psat1。 我究竟

  • 问题内容: 我在Windows 7上,对这个数据库东西有些陌生。我尝试在Google上搜索如何将时区从我的系统更改为UTC,但是文档有些高级,因此我不太确定如何更改此字段。 问题答案: 在my.ini文件的[mysqld]部分下,添加以下行: 重新启动服务器。您还可以在运行时从命令行使用以下命令进行设置 MySql的文档

  • 我有一个运行的Mongo DB容器,名为xyz,来自官方Mongo图像。我用创建了这个容器,在这个容器中,我创建了两个带有样本数据的集合。 现在我想在dockerhub上的新图像中提取这个容器。 我使用了docker commit,创建了一个新图像,并将其推送到docker hub上。如果我在另一个系统上提取图像,并从该图像创建一个新的容器,那么在我的原始容器xyz中就没有类似的数据。 经过研究,

  • 问题内容: 假设我有一个基于的琐碎容器。现在有一个安全更新,并在docker repo中进行了更新。 我怎么知道我的本地映像及其容器在后面运行? 是否有一些最佳实践来自动更新本地映像和容器以跟随docker repo更新,实际上,这会给您带来与在常规ubuntu机器上运行无人值守升级一样的好处。 问题答案: 一种方法是通过CI / CD系统来驱动它。构建父映像后,请使用该父映像扫描git repo

  • 假设我有一个基于< code>ubuntu:latest的小容器。现在有一个安全更新,docker repo中更新了< code>ubuntu:latest。 > 我怎么知道我的本地映像及其容器在后面运行? 是否有一些最佳实践可以自动更新本地映像和容器以遵循 docker 存储库更新,这在实践中将为您提供在传统 ubuntu 计算机上运行无人值守升级的相同细节