我正在尝试将配置文件复制到具有主机安装目录的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。所以我在这里想念什么?
答案 0 :(得分:1)
每个问题:
...如果我使用的话
-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/
答案 1 :(得分:0)
欢迎来到。
在第一种情况下,您要告诉docker创建一个Volume(https://docs.docker.com/storage/volumes/)并将其安装在/var/jenkins_home
上,
docker使用docker映像中已经存在的数据预填充卷。如果该卷已经存在,它将重新使用它。
您可以通过执行以下操作来检查您的卷:
docker volume ls
在第二种情况下,由于将主机(本地计算机/ vm)中的目录绑定(https://docs.docker.com/storage/bind-mounts/)绑定到容器,因此看不到文件。您在/var/jenkins_home
下看到的所有文件都将与主机目录/folder
中的文件相同。
这会在运行时(创建容器时)发生,如果您想在Docker映像中包含一些默认文件,则可以在构建时通过使用COPY
或ADD
指令来执行此操作,就像您一样这样做时,这些文件将在构建时复制到映像中。但是,如果在运行时指定目录或文件的绑定装载,则基本上是在替换它们。