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.sh
And then in your deploy.sh
something like:
#!/bin/bash ssh deploy@$MY_SECRET_SERVER << EOFdocker stop my-killer-appdocker rm my-killer-appdocker rmi me/my-container:currentdocker pull me/my-container:latestdocker tag me/my-container:latest me/my-container:currentdocker run -d --restart always --name my-killer-app -p 3000:3000 me/my-containerEOF
And 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":
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 dockerpuller
Step 2.
After that, set the DOCKERPULLER_SECRET
and optionally PORT
environment variables and start Dockerpuller:
PORT=7777 DOCKERPULLER_SECRET="PorgsWereNotOverused12345" dockerpuller
To 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":
By default, Dockerpuller will read config from package.json, so let's also add that:
"scripts": ,"config":
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 deploy
Step 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":
.travis.yml (or other .yml
)
after_success:- - docker build -t me/my-container .- - docker push me/my-conainer- - ./scripts/deploy.sh+ - npm run deploy
And 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!