我有一个Dockerfile,它使用FROM
指令扩展了一个声明了VOLUME
的镜像。是否有一种方式可以覆盖VOLUME
指令,以便"删除"VOLUME
?
我有一个Dockerfile,它使用FROM
指令扩展了一个声明了VOLUME
的镜像。是否有一种方式可以覆盖VOLUME
指令,以便"删除"VOLUME
?
不行。
唯一的方法是,克隆您使用的基础映像FROM
中的Dockerfile
并手动删除VOLUME
指令。然后构建它,并将其用作您的FROM
基础映像。
有时你无法修改原始的Dockerfile——比如我这种情况,需要使用生产环境中的镜像。唯一的机会是修改元数据(使用docker save/load操作)。因为我经常需要这样做,所以我写了一个小脚本来帮助处理,可以看看docker-copyedit是否能对你有所帮助。
您可以覆盖文件。 使用多阶段构建和COPY(docker 19.03)。 第一阶段 在VOLUME文件夹之外创建文件。或者在添加/修改文件的同一RUN步骤中将其复制到该文件夹之外。 下一阶段将文件从上一个阶段复制到VOLUME文件夹中。
不,无法覆盖父Docker镜像中的VOLUME指令以“删除”该VOLUME。
Dockerfile中的VOLUME指令用于创建卷的挂载点,这是一种在容器文件系统之外存储持久数据的方法。当您在Dockerfile中使用FROM指令扩展声明了VOLUME的父镜像时,VOLUME指令会被子镜像继承。
如果您想从子镜像中删除VOLUME指令,则需要基于父镜像创建一个新的Docker镜像,但不包含VOLUME指令。您可以通过创建一个新的Dockerfile来实现这一点,该文件使用FROM指令指定父镜像,然后省略VOLUME指令。
例如,如果父镜像的Dockerfile中有如下的VOLUME指令:
VOLUME /data
dockerfile
FROM parent-image:tag
# Omit the VOLUME directive
enter code here
docker build -t child-image:tag .
生成的子镜像将基于父镜像,但不会有VOLUME指令。请注意,之前存储在父镜像定义的卷中的任何数据将无法在子镜像中使用。
请记住,删除VOLUME指令可能会对您的应用程序产生意想不到的后果,例如使跨容器实例持久化数据更加困难。在从Docker镜像中删除VOLUME指令之前,请务必仔细考虑其影响。
假设源图像被命名为original_image
,并且是从包含VOLUME /data
指令的Dockerfile
构建的。要构建带有内容的最终镜像,只需在辅助的Dockerfile
中执行docker build -t final_image_with_data_in_volume_dir .
,该文件仅包含这两行:
FROM original_image
COPY data_dir /data
其中data_dir
是本地准备好的数据文件夹,旨在位于/data
目录中。
(这与@a b的答案类似,但文本过长,无法仅作为评论。)
背景:我使用docker化的Neo4j图形数据库技术。原始镜像声明数据文件目录为VOLUME
。因此,不可能通过docker commit
进行任何更改,以获得具有更改数据的全新镜像(有时希望将数据放在容器内,例如用于TestContainer测试)。然后可以使用docker build
来解决这个问题。