Node Server Tutorial - Part 5: Docker Target

Using Docker

Let's take a look at the Dockerfile that was generated when we first created the repo.

# This file is generated by Nx. # # Build the docker image with `npx nx docker-build products-api`. # Tip: Modify "docker-build" options in project.json to change docker build args. # # Run the container with `docker run -p 3000:3000 -t products-api`. FROM docker.io/node:lts-alpine ENV HOST=0.0.0.0 ENV PORT=3000 WORKDIR /app RUN addgroup --system products-api && \ adduser --system -G products-api products-api COPY dist/products-api products-api RUN chown -R products-api:products-api . CMD [ "node", "products-api" ]

There is also an Nx target to build your Docker image.

Terminal

~/products-api

npx nx docker-build products-api

> nx run products-api:build > nx run products-api:docker-build #1 [internal] load build definition from Dockerfile #1 sha256:4c99d8269ea9b513bd4dc776dba71aa66d5829ea8e590b8aeb803a2067f59cd7 #1 transferring dockerfile: 37B done #1 DONE 0.0s #2 [internal] load .dockerignore #2 sha256:e71d5f0270d20785d8ae5f235f0abefd0806a3001ce09bbd5fd6f34cb8b1ca81 #2 transferring context: 2B done #2 DONE 0.0s #3 [internal] load metadata for docker.io/library/node:lts-alpine #3 sha256:e161ecf2e6f1cf45a4881933800e629a1213e55a987b539a70bb5826846509fd #3 DONE 0.2s #8 [1/5] FROM docker.io/library/node:lts-alpine@sha256:fda98168118e5a8f4269efca4101ee51dd5c75c0fe56d8eb6fad80455c2f5827 #8 sha256:00cf67cfc27afade2e1236f1196ec1d784e6c26792e57b580683350c09199e48 #8 DONE 0.0s #9 [internal] load build context #9 sha256:9103d257e071bd890d889058da8bff61c78e8bb01b7ed24337b78f75e8830218 #9 transferring context: 1.70MB 0.1s done #9 DONE 0.1s #4 [2/5] WORKDIR /app #4 sha256:17db46c2fd7998a5902ae01d80def26aa254289bbab2c6fc5aacc55252ac84b0 #4 CACHED #5 [3/5] RUN addgroup --system products-api && adduser --system -G products-api products-api #5 sha256:b44659fc59b4a2b2d6e4ab5e87ab46bcef11185d06154f4b1ec6d7a1753379f2 #5 CACHED #6 [4/5] COPY dist/products-api products-api #6 sha256:b903d3e7efcc38acf17f87fc8de482eb267fe0269156e8862cf149cdee04c2df #6 CACHED #7 [5/5] RUN chown -R products-api:products-api . #7 sha256:250b9a198f6002246bab3725d205af49d6327990451320d8642f56b9882f4f0a #7 CACHED #10 exporting to image #10 sha256:e8c613e07b0b7ff33893b694f7759a10d42e180f2b4dc349fb57dc6b71dcab00 #10 exporting layers done #10 writing image sha256:e3543d878821de18de83201719f1f333bb7072a50e42216ff5c253db9081ce71 done #10 naming to docker.io/library/products-api done #10 DONE 0.0s Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them ———————————————————————————————————————————————————————————————————————————————————————————————————————————— > NX Successfully ran target docker-build for project products-api and 1 task it depends on (2s) View logs and investigate cache misses at https://nx.app/runs/NrNdfzx12g

The docker-build command is defined as a target in the root project.json file. If you need to make any modifications to the command, you can make them there. Note that this target is set up so that the build target will always be run first.

{ "targets": { "docker-build": { "dependsOn": ["build"], "executor": "nx:run-commands", "options": { "commands": ["docker build -f orders-api/Dockerfile . -t orders-api"] } } } }

Generate a Micro-service with a Docker File

You can also add a Dockerfile to a new node app using the --docker flag. Here we're creating an orders-api application:

Terminal

~/products-api

npx nx g @nrwl/node:app orders-api --docker

> NX Generating @nrwl/node:application ✔ Which framework do you want to use? · express CREATE orders-api/src/assets/.gitkeep CREATE orders-api/src/main.ts CREATE orders-api/tsconfig.app.json CREATE orders-api/tsconfig.json CREATE orders-api/project.json CREATE orders-api/.eslintrc.json CREATE orders-api/jest.config.ts CREATE orders-api/tsconfig.spec.json CREATE orders-api-e2e/project.json CREATE orders-api-e2e/jest.config.ts CREATE orders-api-e2e/src/orders-api/orders-api.spec.ts CREATE orders-api-e2e/src/support/global-setup.ts CREATE orders-api-e2e/src/support/global-teardown.ts CREATE orders-api-e2e/src/support/test-setup.ts CREATE orders-api-e2e/tsconfig.json CREATE orders-api-e2e/tsconfig.spec.json CREATE orders-api-e2e/.eslintrc.json CREATE orders-api/Dockerfile

What's Next