卷装入/挂接后如何在Docker容器中添加文件?

时间:2019-09-13 09:41:03

标签: docker docker-compose

是否可以在此阶段将文件添加到卷

  • 在构建期间
    但是
  • 在附加/安装卷之后?

例如如果运行docker-compose,则会在此阶段创建卷,但是这些卷是在容器启动之前创建的。因此,在docker-compose期间添加文件的阶段太晚了。

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

1 个答案:

答案 0 :(得分:0)

  

是否有一种在构建过程中将文件添加到卷[...]的方法

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

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

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

如果这是您从Linux发行版构建的映像,则另一种可能性是利用named volumes can be populated with data from the image的Docker功能。有一些重要的警告:仅当容器启动时卷为空时(通常在第一次启动时),如果该目录在Dockerfile中被标记为VOLUME,那么以后就无法添加数据,并且该路径在Kubernetes中不起作用。

  

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

如果您具有SQL格式的转储(不是二进制文件),则标准数据库映像支持/docker-entrypoint-initdb.d目录。将转储放置到那里(在转存的映像中或在第一次启动时绑定安装),映像的入口点将在该目录中运行文件,这是首次数据库初始化的一部分。

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

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