Pushing to a container registy
Google Container Registry is a private registry for docker images. We want to push our images there after building them in wercker so that we can easily pull them when we want to use them (i.e. when we are running them in Kubernetes).
We create a push pipeline using one of wercker’s internal steps, internal/docker-push.
Note: you need to create a service account on your google cloud project, so that wercker can use it to upload your images to the registry. Download the key you get after creating the service account, remove all newlines (the docker push step will fail with a weird error if there are newlines in the key) and then put it in an environment variable (GCR_JSON_KEY_FILE in the example)
However, this alone will not work for our purposes because of the following reasons:
- The image being pushed is not tagged, it will be automatically tagged with ‘latest’ every time you push therefore pulling a specific version is going to be difficult. You can use the commit hash to pull images from gcr, but I prefer to tag master builds with my package.json’s version number
- There is no command specified for running the container, so it simply wont start up
We can fix the both problems by changing the pipeline to this:
name: export version to tag the image with
[ "$WERCKER_GIT_BRANCH" = "master" ] \
&& export PACKAGE_VERSION=$(node -p -e "require('./package.json').version") \
|| export PACKAGE_VERSION=development
cmd: npm start
The script step checks if the branch is master, and exports the package.json’s ‘version’ property as an environment variable.
The docker push step now has a tag, working-dir and cmd. The cmd property executes in the root folder / by default, so I had to add the working-dir property to the step to make it work (this property is not yet documented in worker’s docs but it works).
Now you can open wercker’s UI and add the pipeline after your build pipeline:
Next we will add a pipeline to deploy our app to Kubernetes when build and push succeed, that will be part 3 of this series.