Отключить относительные папки в docker-compose при использовании демона docker через контейнер?

Ранее мы запускали Jenkins в режиме Docker in Docker (DIND), т. е. Докер-контейнер Jenkins. Но из-за множества проблем (некоторые из которых описаны по ссылке выше) мы решили отойти от этого подхода и вместо этого позволить контейнеру использовать хост-демон, просто монтируя его как том при запуске контейнера:

-v /var/run/docker.sock:/var/run/docker.sock

Но теперь мы сталкиваемся с проблемами при монтировании относительных путей с помощью Docker Compose, который запускается внутри контейнер, который отлично работал в режиме DIND. Рассмотрим этот файл docker-compose:

myimage:
  build: .
  environment:
     LANG: C.UTF-8     
  working_dir: /code
  volumes:
    - ../../../:/code
    - ~/.m2/repository:/root/.m2/repository
    - ~/.gradle:/root/.gradle

Раньше он монтировал все папки, например папку ../../../, из контейнера, но теперь, кажется, пытается монтировать их с хоста. Когда я проверяю структуру каталогов на хосте, кажется, что docker-compose реплицировал структуру каталогов из контейнера, а затем пытается смонтировать эту папку, что делает ее пустой.

Итак, мой вопрос: как можно смонтировать относительные пути в Docker Compose при использовании демона докеров с хоста?


person Johan    schedule 18.12.2017    source источник
comment
Не понимаю, почему за это проголосовали, мне бы хотелось знать, чтобы я мог улучшить свои вопросы в будущем.   -  person Johan    schedule 18.12.2017


Ответы (2)


Вам нужно убедиться, что относительный путь на вашем хосте такой же внутри вашего контейнера Jenkins, чтобы это работало.

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

В качестве другого варианта вы можете рассмотреть возможность переключения на именованные тома и сопоставить тот же именованный том в контейнере Jenkins, что и в других ваших контейнерах.

person BMitch    schedule 18.12.2017

Docker имеет клиент-серверную архитектуру, когда вы монтируете сокет docker, который находится на хосте, вы просто общаетесь с демоном docker хоста. Таким образом, весь путь тома хоста будет интерпретироваться как путь на хосте.

Чтобы решить эту проблему, вам нужно привязать каталоги контейнеров jenkins к хосту, а затем использовать папки хоста в качестве точек монтирования. Таким образом, просто запустите контейнер jenkins с помощью

-v ./code:<path-to-../../..> -v ./m2-repo:.../.m2/repository

Затем измените файл компоновки, чтобы использовать папки хоста:

myimage:
  build: .
  environment:
     LANG: C.UTF-8     
  working_dir: /code
  volumes:
    - ./code:/code
    - ./m2-repo:/root/.m2/repository
    ...
person yamenk    schedule 18.12.2017
comment
Спасибо, но проблема в том, что <path-to-../../> отличается для каждого проекта Jenkins. Я хотел бы избежать необходимости менять тома каждый раз, когда добавляется новый проект (обратите внимание, что я не проголосовал за ваш ответ). - person Johan; 18.12.2017