Docker提交-未保存数据库更改

时间:2018-08-24 13:45:05

标签: docker lamp

我安装了最新的Docker CS,并从Docker Hub获得了LAMP image。我正在尝试在其中创建一个数据库,并使用保存在其中的数据库制作一个新映像。

  1. 启动容器:docker run --name mycontainer fauria/lamp 这将启动基于Ubuntu的容器并启动Apache服务器。 MySQL服务器也在容器中运行。
  2. 访问容器外壳:docker exec -i -t mycontainer bash
  3. 创建一个数据库并在其上运行一些MySQL命令: mysql -u root CREATE DATABASE mydbname; USE mydbname; CREATE FUNCTION ... ...
  4. 停止容器:docker stop mycontainer
  5. 创建映像:docker commit docker ps -l -q mynickname/appname:v1
  6. 删除容器docker container rm mycontainer

现在我希望,如果我基于新映像运行容器,那么数据库已经存在。但这不在那里。 docker run --name mycontainer --rm -p 80:80 -e LOG_STDOUT=true -e LOG_STDERR=true -e LOG_LEVEL=debug -v /home/username/dev/appname/www:/var/www/html mynickname/appname:v1

我想念什么?

4 个答案:

答案 0 :(得分:1)

原因是/var/lib/mysql在Dockerfile中被列为VOLUME

您所做的更改将保留在docker stop <yourcontainer>docker start <yourcontainer>命令之间。但是,当您提交容器时,Dockerfile中标记为VOLUME的每个目录都将替换为其原始内容。 (即使您没有将外部卷挂载到该目录,也会发生这种情况。)请参见docker commit

通过在VOLUME目录之外的某处进行更改,可以轻松地检查其他更改是否保留在提交中。例如,在容器内运行date>/mydate,然后提交。然后,您从该映像运行新容器时,文件/mydate仍将存在。

如果要保留数据库更改,可以通过克隆存储库,然后从Dockerfile中删除行VOLUME /var/lib/mysql来实现。如果您随后构建并运行新映像,则在提交容器时它将保留数据库更改。

通常,在生产环境中,您可以将数据库文件安装在数据容器中或主机上。这样,如果您要提交容器,数据库数据将保留在数据容器或主机中。

答案 1 :(得分:0)

这不是数据库通过容器工作的方式。您必须将数据持久保存在主机上才能保留。容器是一次性的,它们来来去去。

我建议您通过卷将与数据库相关的数据持久存储在主机上。万一容器崩溃,下一个容器应保留该容器的服务,并且数据将被保留。

例如:-

在官方的mysql示例中

$ docker run --name some-mysql -v /my/own/datadir:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag

您可以看到它们正在装入一个卷以保留数据并在容器重启时保留。

干杯!

答案 2 :(得分:0)

使数据与映像一起提交是用于测试的有用方案。使用预制的基础映像时,您可能必须删除VOLUME条目,请参阅docker-copyedit

答案 3 :(得分:0)

就我而言,我是通过将数据库转储到SQL文件中来保存数据库架构更改的。我的工作如下:

  1. 我创建了一个简单的bash脚本,将数据库作为初始化转储到/docker-entrypoint-initdb.d/dump.sql。

#!/bin/bash

mysqldump -u root cepheid_development --single-transaction --quick --lock-tables=false > /docker-entrypoint-initdb.d/dump.sql

  1. 我将脚本复制到Dockerfile中的容器中:

COPY docker_resources/dump_db.sh /tmp

  1. 我从容器外部(命令行或其他脚本)自动运行脚本:

docker exec $container_id /tmp/dump_db.sh