Как скопировать файлы в каталог, смонтированный на хосте, в Docker-контейнере - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь скопировать файлы конфигурации в образ jenkins / jenkins с помощью смонтированного на хосте каталога.часть моего Dockerfile:

FROM jenkins/jenkins
COPY file.txt /var/jenkins_home/

Пытался использовать объем следующим образом:

-v volume_name:/var/jenkins_home

, в этом случае я вижу "file.txt" в jenkins, но если я использую:

-v /folder:/var/jenkins_home

я вообще не вижу file.txt в jenkins.так что я здесь скучаю?

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

По вашему вопросу:

... если я использую:

-v /folder:/var/jenkins_home

я вообще не вижу file.txt в jenkins. так что я здесь скучаю?

Тома хоста, иногда называемые связывающими монтированием из-за их базовой реализации, не инициализируют том из содержимого изображения. Только именованные тома обеспечивают поддержку инициализации от механизма докера. Однако можно выполнить именованный том для монтирования с другим синтаксисом. Вот несколько примеров различных способов сделать это:

  # 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 голосов
/ 15 апреля 2019

Добро пожаловать в SO.

В вашем первом сценарии вы говорите докеру создать том (https://docs.docker.com/storage/volumes/) и смонтировать его на /var/jenkins_home, докер предварительно заполняет том данными).это уже существует в образе докера. Если том уже существовал, он будет использовать его повторно.

Вы можете проверить свои тома, выполнив:

docker volume ls

Во втором сценарии вы не видитефайл, потому что вы привязываете монтирование (https://docs.docker.com/storage/bind-mounts/) каталог с вашего хоста (локальный компьютер / vm) к контейнеру. Все файлы, которые вы видите в /var/jenkins_home, будут такими же, как в вашем хост-каталоге /folder.

Это происходит во время выполнения (при создании контейнера), если вы хотите, чтобы в образе докера было несколько файлов по умолчанию, вы делаете это во время сборки, используя инструкции COPY или ADD,как и вы, эти файлы будут скопированы в образ при его создании, но если во время выполнения вы укажете привязку к каталогу или к файлу, который вы в основном заменяете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...