Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将文件复制到docker容器中的主机装载目录_Docker_Jenkins_Dockerfile - Fatal编程技术网

如何将文件复制到docker容器中的主机装载目录

如何将文件复制到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_

我正在尝试将配置文件复制到主机挂载目录下的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_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/完成了工作,谢谢!