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

如何在装入/连接卷后在docker容器中添加文件?,docker,docker-compose,Docker,Docker Compose,是否有方法在阶段中将文件添加到卷 在构建过程中,但是 在连接/装入卷之后 例如,如果运行docker compose,将在此阶段创建卷,但卷是在容器启动之前创建的。因此,在docker compose期间添加文件的阶段太晚了 例如,我想将数据库的二进制文件作为数据库的init添加到卷中 是否有方法在生成期间将文件添加到卷[…]中 不可以。以后可能附加到容器的任何卷在生成序列期间都不会附加,甚至可能不存在。您不能保证在任何情况下,给定的映像总是在连接相同卷的情况下运行 通常的方法是包含一个程序

是否有方法在阶段中将文件添加到卷

  • 在构建过程中,但是
  • 在连接/装入卷之后
例如,如果运行docker compose,将在此阶段创建卷,但卷是在容器启动之前创建的。因此,在docker compose期间添加文件的阶段太晚了

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

是否有方法在生成期间将文件添加到卷[…]中

不可以。以后可能附加到容器的任何卷在生成序列期间都不会附加,甚至可能不存在。您不能保证在任何情况下,给定的映像总是在连接相同卷的情况下运行

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

#/垃圾箱/垃圾箱
#我是docker-entrypoint.sh
如果[!-f/var/data/some-file.txt];然后
初始化\u数据\u树/var/data
fi
执行官“$@”
如果它是您从Linux发行版基础构建的映像,那么另一种可能是利用Docker特性。这里有一些重要的警告:只有当容器启动时(通常在第一次启动时)卷为空时才会发生这种情况,如果目录在Dockerfile中标记为
volume
,那么以后就不能添加数据,并且此路径在Kubernetes中不起作用

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

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

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


您可以做的另一件事是在装载到容器(而不是命名卷)中的主机目录绑定的情况下启动数据库一次,然后进行首次设置。停止容器并对该目录加焦油。现在,当您需要数据库克隆时,卸载二进制内容并绑定将新目录装载到新容器中。(如果Docker本机支持此模式可能会很好,但它不支持。)

为什么不在构建阶段复制二进制文件呢?或者您可以使用