Private NPM Module with Docker Containers
NPM had announced support for private modules and now its possible to have private or public NPM package which you can publish to Github, Gitlab or NPM repository.
what is NPM Package — npm Edit descriptionwww.npmjs.com
If we talk about NPM which is node package manager but now its like javascript package manager where you can publish a package private or public and your other apps can use that package.
Package is nothing but some software utility or some sdk interface, such package we can get and those feature will get added in our JavaScript application like webpack, grunt, gulp
to add these package or library if we can install simply
npm install — save pkg-name
Can we build such javascript package and publish it, Yes we can publish such packages and others can consume these packages.
Now how to work with Private package which are limited to your organization or can be access with valid access or auth tokens.
Out point of discussion here is how to work with private packaged using Docker or Locally
If we are running application locally and we need to install some private or Organization package then we need to configure our .npmrc file
vi ~/.npmrc
always-auth=true
//gitlab.com/api/v4/packages/npm/:_authToken=AUTH_TOKEN
//gitlab.com/api/v4/projects/PROJECT_ID/packages/npm/:_authToken=AUTH_TOKEN
@my_org:registry=[https://gitlab.com/api/v4/packages/npm/](https://gitlab.com/api/v4/packages/npm/)
Here an example for .npmrc for gitlab private repository, here we have to specify AUTH_TOKEN which we can get from account -> settings-> access-token
This .npmrc will help us to pull private packages which are published in private scope as we have valid credentials to fetch private package
npm install —- save @my_org/packagename
We can run npm install and it will install all public and private package as we have .npmrc which will validate package pull from private repository
Now what if we have to do same for Docker setup, In this case we have to make few arrangements Dockerfile for your Node projects
To access the private modules in NPM, we need to pass the GIT_TOKEN environment variable to the Docker image.
ENV GIT_TOKEN=token
The naive approach would be to add it using the ENV, However, it does not work. The variables set with ENV are for runtime only. so we can have setup like below mentioned Dockerfile
FROM node:carbon
WORKDIR /usr/src/app
ARG GIT_TOKEN
COPY package.json package-lock.json .npmrc ./
RUN npm install
RUN rm -f .npmrc
# Add your source files
COPY . .
EXPOSE 3000
RUN npm run build
cmd npm run start:dev
You can test docker build for this container by passing GIT_TOKEN argument during build, To build the image using this image and the token, you can run Docker:
docker build --build-arg GIT_TOKEN=${GIT_TOKEN} .
Now we can update docker-compose.yml and populate GIT_TOKEN for our build environment
version: '3.5'
services:
gateway:
image: nginx:1.11
ports:
- 88:80
- 443:443
depends_on:
- svc_car
- svc_company
- svc_user
networks:
- svc_network
svc_mongo:
image: mongo
container_name: svc_mongo
restart: unless-stopped
ports:
- 27017:27017
networks:
- svc_network
svc_gatekeeper:
container_name: svc_gatekeeper
build: ./gatekeeper/
image: svc_gatekeeper
ports:
- 4001:3000
depends_on:
- svc_mongo
- svc_redis
networks:
- svc_network
docker-compose.override.yml
version: '3.5'
services:
svc_mongo:
volumes:
- mongo_data:/data/configdb
- mongo_data:/data/mysql
gateway:
volumes:
- ./proxy/default.conf:/etc/nginx/conf.d/default.conf:ro
- ./proxy/ssl:/etc/nginx/ssl:ro
svc_redis:
volumes:
- redis_data:/var/lib/redis
svc_gatekeeper:
build:
args:
GIT_TOKEN: TOKEN
volumes:
- ./gatekeeper/:/usr/src/app
- gatekeeper_modules:/usr/src/app/node_modules
- ~/.npmrc/:/root/.npmrc
.npmrc in your code base can look like this which will map to container .npmrc using volume mapping
always-auth=true
//gitlab.com/api/v4/packages/npm/:_authToken=AUTH_TOKEN
//gitlab.com/api/v4/projects/PROJECT_ID/packages/npm/:_authToken=AUTH_TOKEN
@my_org:registry=[https://gitlab.com/api/v4/packages/npm/](https://gitlab.com/api/v4/packages/npm/)
this example was for pulling modules from gitlab but its kind of same for others like Github and NPM module