Node Server Tutorial - Part 5: Docker Target

Generate a Micro-service with a Docker File

Let's create a new orders-api application with a docker file included:

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

This generator has created a basic Dockerfile for the new microservice.

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

You also have an Nx target to build your Docker image.

Terminal

~/products-api

npx nx docker-build orders-api

> nx run orders-api:build > nx run orders-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 orders-api && adduser --system -G orders-api orders-api #5 sha256:b44659fc59b4a2b2d6e4ab5e87ab46bcef11185d06154f4b1ec6d7a1753379f2 #5 CACHED #6 [4/5] COPY dist/orders-api orders-api #6 sha256:b903d3e7efcc38acf17f87fc8de482eb267fe0269156e8862cf149cdee04c2df #6 CACHED #7 [5/5] RUN chown -R orders-api:orders-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/orders-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 orders-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 orders-api 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"] } } } }

What's Next