如何在Docker镜像中包含卷数据?

5

我有一个名为mybase的docker镜像,该镜像由两个卷创建而成。

# set volume mount points for installation and home directory
VOLUME ["/usr/local/data", "/var/local/data"]

现在我想要一个新的生产图像,其中包含该数据作为图像的一部分,以便我可以轻松地提取它。但我不知道如何访问那些数据。
我想要做的事情就像这样。这将是我的新的Dockerfile for prod,它将从当前创建镜像。
FROM mybase
ADD /usr/local/data:/usr/local/data

但是那个目录不在主机上,所以我不知道如何添加它。
2个回答

5

根据数据的性质,您可能会将其视为图像的一部分。在这种情况下,您可以将这些文件与图像一起使用。您可以将其构造为基本图像和特定构建的图像,该构建将在具有所需文件访问权限的主机上构建(例如CI构建节点):

FROM mybase
ADD <source of installation> /usr/local/data
ADD <source of the home data> /var/local/data

这个新的镜像(可能是每次构建版本不同)将会与/usr/local/data/var/local/data的内容一起被拉到目标环境中。

当在生产环境中运行时,如果需要,您仍然可以使用数据容器技术:

docker run --it -v /usr/local/data -v /var/local/data --name my_app_data_container <my_repo>/<my_app>:<build> /bin/false
docker run -d --volumes-from my_app_data_container --name my_app_daemon <my_repo>/<my_app>:<build>

1

我曾遇到同样的问题,最终决定按照文档中描述的备份和还原方法进行操作:

备份操作:

sudo docker run --volumes-from dbdata-prod \
  -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

...并且恢复...

sudo docker run --volumes-from dbdata-test \
  -v $(pwd):/backup busybox tar xvf /backup/backup.tar

谢谢您的回复,这意味着每次代码更改时我都必须这样做。这看起来是一种非常糟糕的部署方法。我不明白为什么不能将代码添加到Docker镜像中。我真的看不出使用卷和数据容器的意义。使用主机卷使事情变得如此简单。我可以轻松地从主机添加代码,除了权限问题外没有其他问题。 - user3214546
如果您在主机上有代码并希望将其挂载到容器中,则可以像我最近所做的那样,但仍然很难管理。我已经改用数据容器,并编写了一个小实用程序,使访问数据容器中的代码变得容易。它被称为Docker Shell(dsh),并提供对包含您正在处理的代码的数据容器的Shell和文件共享访问。https://github.com/Notalib/dsh - mzedeler
我转向纯容器方法的主要原因是,现在其他开发人员可以在自己的工作站上设置整个容器环境,而不受其操作系统(他们只需使用boot2docker)和首选IDE的限制。dsh是他们引导它所需的全部。 - mzedeler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接