Монтаж тома с помощью докер-стека

Ниже приведен мой файл стека докеров.

version: "3"
services:
  my-app:    
    image: my-image:latest    
    volumes:
      - ./certs:/certs   
    ports:
      - 6401:6401
    networks:
      my-net:        
         ipv4_address: 192.168.0.4
networks:
  my-net:
    external: true

Он отлично работает на моей машине, привязывая папку сертификатов к сертификатам внутри контейнера. Однако не работает в моем конвейере CI, где я развертываю эту службу внутри образа docker-stack-node. Я получаю ошибку

неверная конфигурация монтирования для типа "bind": исходный путь монтирования привязки не существует.

Я читал, что если вы привяжете монтирование пути хоста к контейнерам вашей службы, этот путь должен существовать на каждом узле роя. Итак, я думаю, мне нужно создать именованный том. Однако с указанным томом я не могу указать исходный путь сертификатов. Это сбивает с толку. Кто-нибудь может с этим помочь?


person Niraj    schedule 19.10.2018    source источник
comment
Я не думаю, что это имеет какое-то отношение к названному тому. Я думаю, что это конкретно связано с тем, что на хост-машине CI нет каталога сертификатов, откуда он когда-либо работал. Я не уверен, почему сертификаты должны находиться на смонтированном томе. Как генерируются сертификаты? Генерируются ли они каждый раз при запуске CI или это больше похоже на секрет или где-то хранящийся артефакт? Если они сгенерированы, вы можете добавить еще один образ + контейнер, который генерирует, или вы можете добавить его из захвата с платформы управления секретами или артефакта.   -  person Will C    schedule 19.10.2018
comment
Это артефакт, хранящийся в репозитории (не очень хорошая практика, но это только для тестирования). Поэтому, когда CI запускается, репо клонируется на раннер, а затем служба развертывается на машине бегуна. Когда я запускаю ls в файле gitlab ci, я вижу там каталог с именем certs. Может быть каталог выполнения докеров другой? my использует другой контейнер для копирования этих файлов?   -  person Niraj    schedule 19.10.2018
comment
@Niraj, как ты это решил?   -  person Dr. House    schedule 30.09.2019


Ответы (2)


@Niraj Я тоже столкнулся с этой проблемой и понял, что каждому узлу нужны файлы для запуска. В вашем случае я бы сделал это:

  1. In your Dockerfile create the certs folder
    • RUN mkdir /certs
  2. Change compose-file to use absolute path
    • - $PWD/certs:/certs
  3. Copy certs into container
    • docker cp <file_name> <container_id>:/certs

Надеюсь это поможет!

person CyberDemic    schedule 22.03.2020

Для привязки к каталогу каталог должен существовать на хост-машине, поэтому ./certs не существует на хосте, на котором запущен контейнер, поэтому ...

Если вы хотите привязать том, вам нужно будет запустить:

mkdir -p ./certs

на машине запущен контейнер и он будет работать.

Он работает на вашем компьютере, потому что каталог существует локально.

Скопировать каталог на хост

scp -r /local/directory/ username@to_host:/remote/directory/
person VinDev    schedule 19.10.2018
comment
Но как мне скопировать содержимое сертификатов в этот новый каталог? Кажется, его нет в каталоге хоста. - person Niraj; 19.10.2018
comment
Может ли кто-нибудь ответить на следующий вопрос Нираджа? - person Dr. House; 30.09.2019
comment
ssh или scp на хост - person VinDev; 01.10.2019