我正在尝试使用主机安装目录将配置文件复制到jenkins / jenkins映像。我的Dockerfile的一部分:
FROM jenkins/jenkins
COPY file.txt /var/jenkins_home/
试图使用这样的音量:
-v volume_name:/var/jenkins_home
在这种情况下,我确实在jenkins看到“file.txt”,但如果我使用:
-v /folder:/var/jenkins_home
我根本没有在jenkins中看到file.txt。我在这里想念的是什么?
根据你的问题:
......如果我使用:
-v /folder:/var/jenkins_home
我根本没有在jenkins中看到file.txt。我在这里想念的是什么?
主机卷(有时因为其底层实现而被称为绑定挂载)不会从映像内容初始化卷。只有命名卷才能从docker引擎提供初始化支持。但是,可以使用不同的语法对绑定装载执行命名卷。以下是不同方法的几个示例:
# create the volume in advance
$ docker volume create --driver local \
--opt type=none \
--opt device=/home/user/test \
--opt o=bind \
test_vol
# create on the fly with --mount
$ docker run -it --rm \
--mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/home/user/test \
foo
# inside a docker-compose file
...
volumes:
bind-test:
driver: local
driver_opts:
type: none
o: bind
device: /home/user/test
...
在你的情况下,你可以这样做:
docker run -it --rm \
--mount type=volume,dst=/var/jenkins_home,volume-driver=local,volume-opt=type=none,volume-opt=o=bind,volume-opt=device=/folder \
...
要回答你实际上要做的事情:
也就是说,Jenkins图像定义了/ var / jenkins_home中的卷,它阻止了使用更改该文件夹的RUN命令扩展图像的能力。 COPY和ADD恰好可以正常工作,因为它们不会创建临时容器。作为一种解决方法,Jenkins开发人员在映像中使用/usr/share/jenkins/ref/
作为初始化/ var / jenkins_home目录的源。所以你的Dockerfile应该在那里复制你想要的文件:
FROM jenkins/jenkins
COPY file.txt /usr/share/jenkins/ref/
欢迎来到SO。
在您的第一个场景中,您告诉docker创建一个Volume(https://docs.docker.com/storage/volumes/)并将其安装在/var/jenkins_home
上,docker会使用docker镜像中已存在的数据预先填充该卷。如果卷已经存在,它将重用它。
您可以通过执行以下操作来检查卷:
docker volume ls
在第二种情况下,您没有看到该文件,因为您将主机(本地计算机/虚拟机)中的目录(https://docs.docker.com/storage/bind-mounts/)绑定到容器。您在/var/jenkins_home
下看到的所有文件都与主机目录/folder
中的文件相同。
这在运行时发生(当创建容器时),如果你想在docker镜像中有一些默认文件你在构建时使用COPY
或ADD
指令执行此操作,就像你正在做的那样,这些文件将被复制到构建它时的图像。但是如果在运行时指定了目录或文件的绑定挂载,那么基本上就是替换它们。