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

问题描述 投票:0回答:2

我正在尝试使用主机安装目录将配置文件复制到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。我在这里想念的是什么?

docker jenkins dockerfile
2个回答
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/

0
投票

欢迎来到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镜像中有一些默认文件你在构建时使用COPYADD指令执行此操作,就像你正在做的那样,这些文件将被复制到构建它时的图像。但是如果在运行时指定了目录或文件的绑定挂载,那么基本上就是替换它们。

© www.soinside.com 2019 - 2024. All rights reserved.