node library how create node.js docker npm docker-registry npm-private-modules

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 ):

  1. inicie sesión en su registro privado de npm con el usuario que desea usar para la ventana acoplable
  2. 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"

  1. 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" ]

  1. Haga todos sus contenedores node.js / io.js FROM you/iojs y listo.