dockerpuller v1.0.1
Dockerpuller
A tiny microservice/cli tool that will push/pull Docker images for you.
Why?
Let's say you need to deploy a Docker container to your staging machine after your CI tests are done.
You might have a section in your .travis.yml (or other .yml) that has something like this:
after_success:
- docker build -t me/my-container .
- docker push me/my-conainer
- ./scripts/deploy.shAnd then in your deploy.sh something like:
#!/bin/bash
ssh deploy@$MY_SECRET_SERVER << EOF
docker stop my-killer-app
docker rm my-killer-app
docker rmi me/my-container:current
docker pull me/my-container:latest
docker tag me/my-container:latest me/my-container:current
docker run -d --restart always --name my-killer-app -p 3000:3000 me/my-container
EOFAnd that sort of does the job, but every time you set up a new project you need to do a bunch of setup like SSH keys, putting that deploy.sh in the project, etc.
With Dockerpuller you can just put
"scripts": {
"deploy": "dockerpuller --deploy"
}And run npm run deploy instead of that deploy.sh script.
Awesome! How do I set it up?
Step 1.
Okay, first things first, install Dockerpuller globally on your Docker host:
npm install -g dockerpullerStep 2.
After that, set the DOCKERPULLER_SECRET and optionally PORT environment variables and start Dockerpuller:
PORT=7777 DOCKERPULLER_SECRET="PorgsWereNotOverused12345" dockerpullerTo run it as a service, you can use PM2 or Forever.
Step 2.5.
Then in your CI create the DOCKERPULLER_SECRET environment variable and set it to the same value as on your Docker host.
Step 3.
Configure your project. Install Dockerpuller and add deploy script to your package.json:
npm install --save-dev dockerpuller"scripts": {
"deploy": "dockerpuller --deploy"
}By default, Dockerpuller will read config from package.json, so let's also add that:
"scripts": {
"deploy": "dockerpuller --deploy"
},
"config": {
"dockerpuller": {
"host": "http://mydockerhost.com:7777",
"image": "me/my-container",
"ports": "3000:3000",
"name": "my-killer-app"
}
}If you don't want to add config field to your package.json, Dockerpuller also supports respective CLI options. Or CURL. Both will be explained in a bit.
NOTE: Dockerpuller will not create Dockerfile for you. Don't forget to have it in place.
Step 4.
Change your .travis.yml (or other .yml) to the following:
after_success:
- docker build -t me/my-container .
- docker push me/my-conainer
- - ./scripts/deploy.sh
+ - npm run deployStep 4.25
By the way, you can have Dockerpuller build the container for you by adding a --build option.
Let's do that:
package.json:
"scripts": {
"deploy": "dockerpuller --build --deploy"
}.travis.yml (or other .yml)
after_success:
- - docker build -t me/my-container .
- - docker push me/my-conainer
- - ./scripts/deploy.sh
+ - npm run deployAnd you're done! Now just let the magic happen.
CLI Options
If you don't want to set config in package.json, Dockerpuller supports following CLI options:
-h, --host [host]- Config: Docker host URL-n, --name [name]- Config: Docker container name-p, --ports [ports]- Config: Port bindings (i.e.80:3000)--deploy- Run deployment--build- Build an image before deploying
CURL usage
If you don't want to add Dockerpuller to your project's dependencies (no one wants another dependency), you can run your deployment by running a CURL command on your CI:
curl -X "POST" "http://mydockerhost:7777" \
-H 'Content-Type: application/json; charset=utf-8' \
-d $'{ \
"secret": "'"$DOCKERPULLER_SECRET"'", \
"ports": "80:3000", \
"container": "me/my-container", \
"name": "my-killer-app" \
}'And you're done!