2016-08-07 2 views
2

Вот моя проблема:Docker сочинить - доступ к данным из контейнера в контейнер B

У меня есть контейнер (Node.js) и контейнер B (Nginx). В Dockerfile контейнера A я создаю несколько файлов из источников, поскольку они необходимы для запуска сервера в папку с именем build. Я хочу получить доступ к этой папке из контейнера B для обслуживания статических файлов.

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

Моя первая попытка, что почти работа заключалась в следующем:

version: "2" 
services: 
    nginx: 
     volumes_from: 
      - node 

    node: 
     volumes: 
     - /code/build 

Когда я первый построил докер сочинять строить & все, казалось, работало хорошо, контейнер создается из контейнера с файлов сборки внутри него и контейнер B может получить к ним доступ, как ожидалось.

Однако проблема возникает, когда источники обновляются. Когда это происходит, новые файлы сборки не заменяют старый в контейнере, потому что существующий контейнер, похоже, имеет приоритет. Поэтому после первого раза у меня всегда есть старые файлы для обоих контейнеров A и B.

Я исследовал способ заставить громкость воссоздавать с нуля каждый раз, когда я запускаю docker-compose build, но ничего не нашел. Единственное, что я нашел, было бы использовать docker-compose stop && docker-compose rm, но это кажется немного взломанным, чтобы делать это каждый раз, и, кроме того, это приводит к довольно длительному простоя по сравнению с заменой существующего контейнера новой версией на docker-compose up.

Есть ли подходящее решение для достижения цели, которую я пытаюсь достичь?

+0

Вы попробовали --build? В конечном итоге лучше всего попытаться отделить их, если это возможно. – ldg

+0

Я пробовал 'build', а затем' up' и '--build up', и результат, похоже, тот же, старый контейнер хранится и его содержимое не переопределяется новыми файлами сборки – Mijamo

ответ

1

Я бы переделал рабочий процесс, используя именованный том, который монтируется в нескольких контейнерах, и один из этих контейнеров - это программа обновления, в которой есть среда сборки приложения. Затем при запуске программа обновления вытаскивает последнюю версию git и обновляет общий том как часть своих CMD или ENTRYPOINT.

Ваш файл Compose будет выглядеть так:

version: "2" 
volumes: 
    build: 
     driver: local 

services: 
    nginx: 
     volumes: 
     - build:/code/build 

    updater: 
     volumes: 
     - build:/code/build 

Тогда на каких-либо изменений, вы можете запустить docker-compose run updater и он будет толкать последние изменения в объеме, где Nginx может использовать его, никогда не останавливая свои другие контейнеры , Поскольку это пакетное задание, которое завершается, даже docker-compose up снова запустит программу обновления.

+0

Интересный рабочий процесс, мне просто интересно как узел-сервер будет изящно перезапускаться с новыми файлами сборки в этой конфигурации? – Mijamo

+0

Вы используете nodejs или nginx? С nginx он должен просто начать принимать новые изменения. С узлом [есть решения для этого] (http://nodemon.io/). – BMitch

+0

Да, nginx автоматически начнет принимать новые изменения, и я уже использую nodemon, но затем он перезапускается постепенно для каждого файла, который изменился, но это скорее вещь nodemon, о которой мне нужно разобраться в этом. – Mijamo

Смежные вопросы