2016-02-25 5 views
2

У меня есть докционированный проект с тремя приложениями и тремя базами данных. Три приложения написаны на узле и, как обычно, используют npm.npm install with docker-compose project

У меня есть сценарий, который клонирует три операции РЕПО, docker-compose.yaml монтирует три контейнеров и использует Dockerfile для каждого из трех проектов, в основном просто сделать npm install и запустить их.

Все это прекрасно работает, но цель этого упражнения - сделать кластер проектов легким в настройке и запуске для целей разработки. Фактически работа над кодом проекта не является проблемой, так как она клонируется разработчиком, но npm install осуществляется через докер и, следовательно, с корнем. Это означает, что node_modules в репозиториях принадлежит root.

Разработчик не может просто сделать npm install, чтобы добавить новый пакет в репо, потому что у них не будет разрешений на node_modules, и модуль, возможно, будет построен с другой архитектурой в зависимости от их хост-системы.

Я думал о создании сценария, который работает npm install в контейнере вместо этого, но есть несколько предостережений:

  1. root будет владеть package.json
  2. Это разбивает поток разработчика типичного узла ... они используются, чтобы просто делать npm install

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

Есть ли какие-либо предложения по обработке установки узлов в контейнере докеров для разработки проекта?

ответ

1

Общая проблема с установленными папками источника, лучшее решение, с которым я столкнулся, заключается в том, чтобы просто сопоставить uid/gid хост-пользователя с некоторым фиксированным пользователем в контейнере. До недавнего времени никто не пришлось прибегнуть к некоторым внешним инструментам и dockerfile/сочинить шаблонов, с последними докеров-Compose версии (> = 1.6.0) вы можете сделать следующее Сейчас:

Dockerfile:

FROM busybox 
ARG HOST_UID=1000 
RUN adduser -D -H -u ${HOST_UID} -s /bin/sh npm 
USER npm 
RUN echo "i'm $(whoami) and have uid: ${HOST_UID}" 

Обратите внимание на директиву ARG. Значение HOST_UID передается во время выполнения через docker build --build-arg HOST_UID=${UID}. Затем просто добавьте пользовательский пользователь npm со значением HOST_UID в качестве его uid и установите его как значение по умолчанию USER для всех следующих команд.

--build-arg теперь также поддерживается Докер-композе и новый формат версии 2 YML:

version: '2' 
services: 
    foo: 
    build: 
     context: . 
     args: 
     HOST_UID: ${UID} 

Предоставлено UID установлен на хосте, docker-compose up foo будет строить изображение с пользователем по умолчанию, который соответствует вашему uid на гостья. Важным уроком, который я узнал, было то, что uid/gid - это все, что имеет значение для разрешений, фактические имена пользователей/групп не имеют значения.

Другой метод, который я использовал несколько раз, - это заменить uid фиксированного пользователя в /etc/passwd/ через sed при запуске контейнера, если установлен определенный env. Это позволяет избежать перекомпоновки изображений и подходит для изображений, которые, как ожидается, будут запускаться прямо из какого-либо репозитория.

Наконец, я бы рекомендовал полностью принять философию докеров, что означает, что ваши разработчики должны использовать только контейнеры проекта для таких задач, как npm install. Вы избегаете неизбежного несоответствия версии и других головных болей в будущем.

+0

Ваш ответ имеет смысл, но только пара наблюдений. Является ли '1000' UID, который я хочу использовать каждый раз? Не могли бы вы также подробнее остановиться на вашем последнем абзаце. Какую версию рассогласования вы имеете в виду? Кроме того, они будут редактировать и работать с кодом на своем хост-компьютере, а не в контейнере (хотя до тех пор, пока я мог бы документировать, как я охотно принимаю выполнение «npm install» через контейнер) –

+0

'1000' в этом случае является просто предоставленное значение по умолчанию, иначе '--build-arg HOST_UID =' становится требованием даже начать сборку. По несоответствию версии я ссылался на инструменты на узле devs и внутри контейнера. Использование IDE вашего хоста в порядке. –