Docker build + частный NPM (+ частный докер-концентратор)

У меня есть приложение, которое работает в контейнере Docker. Он требует некоторых частных модулей из частного реестра NPM компании (Sinopia), и для доступа к ним требуется аутентификация пользователя. Файл Dockerfile FROM iojs:latest.

Я пробовал:

1) создание файла .npmrc в корне проекта, это фактически не имеет никакого значения, и npm, кажется, игнорирует его 2) используя переменные env для NPM_CONFIG_REGISTRY, NPM_CONFIG_USER и т.д., Но пользователь не входит в систему.

По сути, у меня, похоже, нет возможности аутентифицировать пользователя в процессе docker build. Я надеялся, что кто-то может столкнуться с этой проблемой уже (кажется, достаточно очевидной проблемой) и будет иметь хороший способ ее решения.

(В довершение всего, я использую Automated Builds на Docker Hub (запускается при нажатии), чтобы наши серверы могли обращаться к приватному реестру Docker с предварительно созданными изображениями.)

Есть ли хорошие способы: 1) ввод учетных данных для NPM во время сборки (поэтому мне не нужно фиксировать учетные данные для моего файла Docker) ИЛИ 2) делать это другим способом, о котором я не думал

Ответ 1

Я нашел несколько элегантное решение для создания базового изображения для ваших контейнеров node.js/io.js(you/iojs):

  • войдите в свой приватный реестр npm с пользователем, который вы хотите использовать для докеров
  • скопируйте файл .npmrc, который генерирует

Пример .npmrc:

registry=https://npm.mydomain.com/
username=dockerUser
[email protected]
strict-ssl=false
always-auth=true
//npm.mydomain.com/:_authToken="someAuthToken"
  1. создайте Dockerfile, который соответствующим образом скопирует файл .npmrc.

Здесь my Dockerfile (на основе iojs:onbuild):

FROM iojs:2.2.1

MAINTAINER YourSelf

# Exclude the NPM cache from the image
VOLUME /root/.npm

# Create the app directory
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

# Copy npm config
COPY .npmrc /root/.npmrc

# Install app
ONBUILD COPY package.json /usr/src/app/
ONBUILD RUN npm install
ONBUILD COPY . /usr/src/app

# Run
CMD [ "npm", "start" ]
  1. Сделайте все ваши контейнеры node.js/io.js FROM you/iojs, и вам хорошо идти.

Ответ 2

Для тех, кто находит эту статью через google и все еще ищет альтернативный способ, который не включает в себя предоставление вам частных токенов npm на ваших изображениях и контейнерах докеров:

Мы смогли получить эту работу, выполнив npm install до docker build (делая это, вы можете иметь .npmrc вне вашего изображения\контейнер). Как только частные модули установлены локально, вы можете скопировать файлы в изображение как часть вашей сборки:

    # Make sure the node_modules contain only the production modules when building this image
    COPY . /usr/src/app

Вам также необходимо убедиться, что ваш .dockerignore файл не исключает папку node_modules.

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

    FROM nodesource/vivid:LTS

    # For application location, default from nodesource is /usr/src/app
    # Make sure the node_modules contain only the production modules when building this image
    COPY . /usr/src/app
    WORKDIR /usr/src/app
    RUN npm rebuild
    CMD npm start