These are generic npm scripts that you can copy & paste into your package.json
file as-is and get access to convinience scripts to manage your Docker images all in one place.
npm i -g mrm-task-npm-docker
npx mrm npm-docker
Here's the code repository https://github.com/expertly-simple/mrm-task-npm-docker
Looking for npm scripts for AWS ECS? Go here!
Watch the video: Do More With Less JavaScript
Get the book: These scripts are referenced in my book Angular for Enterprise-Ready Web Applications. You can get it on https://AngularForEnterprise.com.
These containers are always up-to-date with the base images from latest
lts
channel fornode
andalpine
.
docker pull duluca/minimal-nginx-web-server
- Documentation: https://hub.docker.com/r/duluca/minimal-nginx-web-server/
docker pull duluca/minimal-node-web-server
- Documentation: https://hub.docker.com/r/duluca/minimal-node-web-server/
- Cross-Platform: Works on Windows 10 and macOS.
docker:build
: Builds your Docker image, using the rootDockerfile
and tags the image aslatest
and whatever version is specificed inpackage.json
like1.0.0
.docker:run
: Run the image you built on your local Docker instance. When you rundocker ps
your image will identified by theimageName
you specify inpackage.json
.docker:debug
: Builds and runs image; tails console logs, so you can see what's happening inside the container; launches target app URLhttp://localhost:imagePort
in a browser; all in one command.
Note that on the very first run
docker:debug
may fail. In this case, simple re-run the command.
docker:publish
: Publishes the image to theimageRepo
specified. This can be on Docker Hub, AWS ECS or any other Docker repository you may create.
- Install Docker for Mac or Windows
npm i --save-dev cross-conf-env npm-run-all
: Needed to ensure cross platform functionality for scripts.
In your package.json
file add a new config property with three sub-properties using your own values, as shown below:
"config": {
"imageRepo": "[namespace]/[repository]",
"imageName": "custom_app_name",
"imagePort": "3000",
"internalContainerPort": "3000"
},
Copy & paste these new scripts under the scripts
property in package.json
:
Note that
docker:runHelper
assumes that your code is listening to port 3000 as reflected byinternalContainerPort
. If this is not the case, update the value in the scripts.
"scripts": {
"predocker:build": "npm run build",
"docker:build": "cross-conf-env docker image build . -t $npm_package_config_imageRepo:$npm_package_version",
"postdocker:build": "npm run docker:tag",
"docker:tag": " cross-conf-env docker image tag $npm_package_config_imageRepo:$npm_package_version $npm_package_config_imageRepo:latest",
"docker:run": "run-s -c docker:clean docker:runHelper",
"docker:runHelper": "cross-conf-env docker run -e NODE_ENV=local --name $npm_package_config_imageName -d -p $npm_package_config_imagePort:$npm_package_config_internalContainerPort $npm_package_config_imageRepo",
"predocker:publish": "echo Attention! Ensure `docker login` is correct.",
"docker:publish": "cross-conf-env docker image push $npm_package_config_imageRepo:$npm_package_version",
"postdocker:publish": "cross-conf-env docker image push $npm_package_config_imageRepo:latest",
"docker:clean": "cross-conf-env docker rm -f $npm_package_config_imageName",
"predocker:taillogs": "echo Web Server Logs:",
"docker:taillogs": "cross-conf-env docker logs -f $npm_package_config_imageName",
"docker:open:win": "echo Trying to launch on Windows && timeout 2 && start http://localhost:%npm_package_config_imagePort%",
"docker:open:mac": "echo Trying to launch on MacOS && sleep 2 && URL=http://localhost:$npm_package_config_imagePort && open $URL",
"docker:debugmessage": "echo Docker Debug Completed Successfully! Hit Ctrl+C to terminate log tailing.",
"predocker:debug": "run-s docker:build docker:run",
"docker:debug": "run-s -cs docker:open:win docker:open:mac docker:debugmessage docker:taillogs"
},
You can customize the build command to run your tests before building the image like:
"predocker:build": "npm run build -- --prod && npm test",
You're done. Now run your scripts. To build and publish an image you only need to use two of the commands frequently.
0. npm run docker:build
: Builds and Tags the image. After first run, you can just use npm run docker:debug
.
npm run docker:debug
: Test (optional), Build, Tag, Run, Tail and launch your app in a browser to test.npm run docker:publish
: Voila, your results are published on the repository you've defined.
You've two options, easy-ish and hard.
- Easy-ish: Use Cloud Run Install the CLI:
$ brew cask install google-cloud-sdk
> choco install gcloudsdk
Deploy your image using the command below, replacing $IMAGE_NAME with the name of your Docker image, i.e. duluca/minimal-node-web-server
:
$ gcloud beta run deploy --image $IMAGE_NAME
Follow the prompts to login, add billing information and you're good to go!
- Hard: Use AWS ECS This is Amazon's Elastic Container Service and it's pretty excellent to use with Docker. However, it is complicated to setup. But worry not; for step-by-step instructions head over to npm scripts for AWS ECS.
A couple of typo/clarity edits can be found at my fork, @duluca, if you're interested.