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"
- создайте
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" ]
- Сделайте все ваши контейнеры 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