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

Leo*_*lov 1 jenkins docker dockerfile

我正在尝试将配置文件复制到带有主机安装目录的 jenkins/jenkins 映像。我的 Dockerfile 的一部分:

FROM jenkins/jenkins
COPY file.txt /var/jenkins_home/
Run Code Online (Sandbox Code Playgroud)

尝试使用这样的音量:

-v volume_name:/var/jenkins_home
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我确实在 jenkins 中看到了“file.txt”,但如果我使用:

-v /folder:/var/jenkins_home
Run Code Online (Sandbox Code Playgroud)

我根本看不到 jenkins 中的 file.txt。所以我在这里想念什么?

BMi*_*tch 6

根据您的问题:

...如果我使用:

-v /folder:/var/jenkins_home
Run Code Online (Sandbox Code Playgroud)

我根本看不到 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
  ...
Run Code Online (Sandbox Code Playgroud)

在你的情况下,你可以这样做:

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 \
  ...
Run Code Online (Sandbox Code Playgroud)

要回答您实际尝试做的事情:

也就是说,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/
Run Code Online (Sandbox Code Playgroud)