node.js - library - docker build+private NPM(+ private docker hub)
npm private library (2)
Tengo una aplicación que se ejecuta en un contenedor Docker. Requiere algunos módulos privados del registro privado de NPM de la empresa (Sinopia), y para acceder a ellos se requiere autenticación de usuario. The Dockerfile es FROM iojs:latest
.
Yo he tratado:
1) crear un archivo .npmrc en la raíz del proyecto, esto en realidad no hace diferencia y npm parece ignorarlo 2) usando variables env para NPM_CONFIG_REGISTRY
, NPM_CONFIG_USER
, etc., pero el usuario no NPM_CONFIG_USER
sesión.
Básicamente, parece que no tengo forma de autenticar al usuario dentro del proceso de docker build
la docker build
. Esperaba que alguien ya se hubiera topado con este problema (parece ser un problema bastante obvio) y que tendría una buena manera de resolverlo.
(Para colmo, estoy usando compilaciones automatizadas en Docker Hub (activado en push) para que nuestros servidores puedan acceder a un registro Docker privado con las imágenes precompiladas).
¿Hay buenas formas de: 1) inyectar credenciales para NPM en el momento de compilación (para no tener que enviar credenciales a mi archivo Docker) O 2) hacer esto de otra manera que no he pensado?
Para aquellos que están buscando este artículo a través de google y aún están buscando una forma alternativa que no implique dejar sus tokens privados de npm en sus imágenes y contenedores de docker:
Pudimos hacer que esto funcionara haciendo la npm install
antes de la npm install
la npm install
docker build
(al hacer esto, le permite tener su .npmrc
fuera de su imagen / contenedor). Una vez que los módulos privados se hayan instalado localmente, puede copiar sus archivos en la imagen como parte de su compilación:
# Make sure the node_modules contain only the production modules when building this image
COPY . /usr/src/app
También debe asegurarse de que su archivo .dockerignore
no excluya la carpeta node_modules
.
Una vez que haya copiado la carpeta en su imagen, el truco consiste en npm rebuild
lugar de npm install
. Esto reconstruirá las dependencias nativas que se vean afectadas por las diferencias entre su servidor de compilación y su sistema operativo Docker:
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
Encontré una solución un tanto elegante para crear una imagen base para sus contenedores node.js / io.js ( you/iojs
):
- inicie sesión en su registro privado de npm con el usuario que desea usar para la ventana acoplable
- copie el archivo
.npmrc
que esto genera
Ejemplo .npmrc
:
registry=https://npm.mydomain.com/
username=dockerUser
[email protected]
strict-ssl=false
always-auth=true
//npm.mydomain.com/:_authToken="someAuthToken"
- cree un
Dockerfile
que.npmrc
archivo.npmrc
apropiada.
Aquí está mi Dockerfile
(basado en 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" ]
- Haga todos sus contenedores node.js / io.js
FROM you/iojs
y listo.