如何将文件复制到docker容器中的主机装载目录
我正在尝试将配置文件复制到主机挂载目录下的jenkins/jenkins映像。 我的Dockerfile的一部分:如何将文件复制到docker容器中的主机装载目录,docker,jenkins,dockerfile,Docker,Jenkins,Dockerfile,我正在尝试将配置文件复制到主机挂载目录下的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 -v /folder:/var/jenkins_
FROM jenkins/jenkins
COPY file.txt /var/jenkins_home/
尝试使用如下音量:
-v volume_name:/var/jenkins_home
在本例中,我确实在jenkins中看到了“file.txt”,但如果我使用:
-v /folder:/var/jenkins_home
-v /folder:/var/jenkins_home
我在jenkins中根本看不到file.txt。那么我在这里错过了什么呢?欢迎来到so
在第一个场景中,您告诉docker创建一个卷()并将其装载到/var/jenkins_home
,
docker使用docker映像中已经存在的数据预填充卷。如果卷已经存在,它将重新使用它
您可以通过执行以下操作来检查卷:
docker volume ls
在第二个场景中,您没有看到该文件,因为您正在将()一个目录从主机(本地计算机/vm)绑定到容器。您在/var/jenkins_home
下看到的所有文件将与主机目录/文件夹中的文件相同
这发生在运行时(当创建容器时),如果您希望在docker映像中包含一些默认文件,您可以在构建时使用复制
或添加
指令执行此操作,就像您正在做的一样,这些文件将在构建映像时复制到映像中。但是,如果在运行时指定了目录或文件的绑定装载,则基本上是在替换它们。欢迎这样做
在第一个场景中,您告诉docker创建一个卷()并将其装载到/var/jenkins_home
,
docker使用docker映像中已经存在的数据预填充卷。如果卷已经存在,它将重新使用它
您可以通过执行以下操作来检查卷:
docker volume ls
在第二个场景中,您没有看到该文件,因为您正在将()一个目录从主机(本地计算机/vm)绑定到容器。您在/var/jenkins_home
下看到的所有文件将与主机目录/文件夹中的文件相同
这发生在运行时(当创建容器时),如果您希望在docker映像中包含一些默认文件,您可以在构建时使用复制
或添加
指令执行此操作,就像您正在做的一样,这些文件将在构建映像时复制到映像中。但是,如果在运行时指定目录或文件的绑定装载,则基本上要替换它们。根据您的问题:
。。。如果我使用:
-v /folder:/var/jenkins_home
-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命令扩展映像。复制和添加恰好起作用,因为它们不创建临时容器。作为一种解决方法,Jenkins开发人员使用映像中的/usr/share/Jenkins/ref/
作为源来初始化/var/Jenkins_主目录。因此,Dockerfile应该将您想要的文件复制到那里:
FROM jenkins/jenkins
COPY file.txt /usr/share/jenkins/ref/
根据您的问题:
。。。如果我使用:
-v /folder:/var/jenkins_home
-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命令扩展映像。复制和添加恰好起作用,因为它们不创建临时容器。作为一种解决方法,Jenkins开发人员使用映像中的/usr/share/Jenkins/ref/
作为源来初始化/var/Jenkins_主目录。因此,Dockerfile应该将您想要的文件复制到那里:
FROM jenkins/jenkins
COPY file.txt /usr/share/jenkins/ref/
这正是我所做的—尝试了复制和添加—但在第二个场景中,我没有看到这些复制的文件—区分构建时的操作和运行时的操作很重要。在本例中,在Dockerfile中,您正在将一些文件复制到一个目录中。这些文件在您的图像中。但是,如果在运行时将目录从主机绑定到容器,绑定到构建时放置这些文件的位置,docker不会将现有文件复制到主机中的目录,它将只显示已装载文件夹的现有内容。这正是我所做的-尝试了复制和添加-但在第二个场景中,我根本看不到这些复制的文件。区分构建时的操作和运行时的操作很重要。在本例中,在Dockerfile中,您正在将一些文件复制到一个目录中。这些文件在您的图像中。但是,如果您在运行时将目录从主机绑定到容器,绑定到构建时放置这些文件的位置,docker不会将现有文件复制到主机中的目录,它只会显示已装载文件夹的现有内容。是的,使用/usr/share/jenkins/ref/完成了这项工作,谢谢!是的,使用/usr/share/jenkins/ref/完成了工作,谢谢!