首页 > 解决方案 > 安装/附加卷后如何在 docker 容器中添加文件?

问题描述

有没有办法在阶段将文件添加到卷中

例如,如果您运行 docker-compose,则在此阶段创建卷,但卷是在容器启动之前创建的。因此,在 docker-compose 期间添加文件的阶段为时已晚。

例如,我想将数据库的二进制文件作为数据库的 init 添加到卷中。

标签: dockerdocker-compose

解决方案


有没有办法在构建期间将文件添加到卷 [...]

不。您以后可能附加到容器的任何卷在构建序列期间都不会附加,甚至可能不存在。您不能保证在任何情况下都将始终使用附加的相同卷运行给定映像。

通常的方法是包含一个可以在需要时创建初始文件系统结构的程序(或者可能从映像中复制“种子”数据)。编写一个入口点脚本,查看文件系统并决定是否需要进行首次初始化,然后运行主容器命令。

#!/bin/sh
# I am docker-entrypoint.sh
if [ ! -f /var/data/some-file.txt ]; then
  initialize_data_tree /var/data
fi
exec "$@"

如果它是您自己从 Linux 发行版库构建的映像,另一种可能性是利用 Docker 功能,即可以使用来自映像的数据填充命名卷。有一些重要的注意事项:只有在容器启动时卷为空时才会发生这种情况(通常在第一次启动时),如果目录VOLUME在 Dockerfile 中标记为 a 则以后无法添加数据,并且此路径不会不能在 Kubernetes 中工作。

我想将数据库的二进制文件作为数据库的 init 添加到卷中。

如果您有 SQL 格式的转储(不是二进制文件),那么标准数据库映像支持/docker-entrypoint-initdb.d目录。将转储放在那里(在衍生映像中或在第一次启动时绑定挂载它),并且映像的入口点将在该目录中运行文件作为首次数据库初始化的一部分。

相反,由于标准数据库图像将其数据目录声明为VOLUME,因此您无法创建其中包含数据的派生图像。

您可以做的另一件事是启动数据库一次,将主机目录绑定安装到容器(不是命名卷)中,然后进行首次设置。停止容器并压缩该目录。现在,当您需要数据库克隆时,解压缩二进制内容并将新目录绑定挂载到新容器中。(如果 Docker 本身支持这种模式可能会很好,但事实并非如此。)


推荐阅读