며칠 전에 DockerHub의 Automated Build에 대해서 글을 썼는데 보통은 이를 이용해서 Docker 이미지를 배포하면 된다. 하지만 Docker 이미지를 빌드하기 전에 추가 작업이 필요하다거나 DockerHub를 쓸 수 없는 상황이라면 CI 등에서 직접 빌드해서 푸시해야 한다. 나 같은 경우는 Automated Build의 존재를 몰라서 CI를 그동안 이용하고 있었는데 나중에도 쓸 일이 있을 것 같아서 정리해 둔다.
Docker 이미지 빌드 및 푸시
Docker 이미지를 빌드한 뒤에 Docker Hub에 푸시하려면 다음과 같은 과정을 진행하게 된다.
- Docker Hub에 로그인한다.
- Dockerfile로 이미지를 빌드한다.
- Docker 이미지를 푸시한다.
$ docker login -u YOUR_USERNAME -p YOUR_PASSWORD
$ docker build -t outsideris/demo:0.0.1 .
$ docker push outsideris/demo:0.0.1
여기에 추가로 latest
태그도 푸시하려면 다음과 같이 기존 이미지로 latest
를 만들고 푸시하면 된다.
$ docker tag outsideris/demo:0.0.1 outsideris/demo:latest
$ docker push outsideris/demo:latest
Travis CI 설정
CI마다 사용방법이 약간씩 다르지만, 기본적인 내용이 대동소이하다. 여기서는 Travis CI를 사용하는데 CI 설정은 이미 되어 있다고 가정하고 Travis CI 클라이언트가 설치되어 있어야 한다.
Docker Hub에 로그인해야 하므로 .travis.yml
에 환경 변수로 저장한다.
...
env:
global:
- DOCKER_USER=outsideris
- DOCKER_PASS=mypassword
...
이렇게 저장하면 뒤에서 배포할 때 docker login -u $DOCKER_USER -p $DOCKER_PASS
로 로그인할 수 있지만 .travis.yml
은 암호화된 파일이 아니고 Git에 저장해야 하므로 비밀번호를 그대로 저장하면 안 되고 암호화해서 저장해야 한다.
$ travis encrypt DOCKER_PASS="mypassword" --add
Travis 클라이언트로 값을 암호화할 수 있다. 위처럼 --add
옵션을 주면 .travis.yml
에 자동으로 추가해 주므로 아래와 같은 형태가 된다.
...
env:
global:
- DOCKER_USER=outsideris
- secure: Yvu4MlhmUAWUpA32mY/TK3DPRITsFhApB5yGbomBaouKqImN2DpftBgQ8Ku4kBtBHw0/4JIXmJ71uWf4jJVI/u3uevGeDUGyAZBVjMM3FrRR1RETAHYczy3CsF7A0PP7GEW41WYKfRV9LRW2j86U97mtXzuymq7lJuYZsSPZpAqhie6W3RifAgFq6rV/gJiqRjFNqqeDkgZ8798lrQgAEcMLvJweqcYpwf/FxapfDH6GmsEScPRtIAPz6yiaZUh+D0FtlpGxszIoKXM8HNtug2tMqjgdeSVOi00qPwxN8fmvudFDMSi5YzwobrtEz/EsRPA8esEZg7txX4UESndBlbdGrTjwEbcruj3D/wnU8GNHvuBfltcvMdzkuTUrNzLdMkA6C+Can3Z3DvAkmNxoXWolAo/lPftZqlzzkcnjvCCdiIfvu5m7we0ZutqmStZOb2y0RjpLX9WoPMwFr4C5ZIH/Pvlc0zlXLWLtHr6nTHX2/OeIFlyWy8MxStyHmUBBYcZ0YrjIiC90K9POOE+SlVakLxZifgzxZiJHgmiL4BGgGR6MYycLbS/Av/Ds7wV1L4XBBGy1Quafxu2nksvZZTaIeozXs0t/qOprmU6TJqf7Pn+m9LYDASlQe+phcmlg+T0OBEZBK0yrJdRfAHcRYCkqflhnQQnoUEHmcKW+TmI=
...
secure
부분이 DOCKER_PASS="mypassword"
부분이고 이는 Travis CI에서 빌드를 돌릴 때 자동으로 복호화되어 환경변수로 설정된다.
빌드 로그를 보면 정상적으로 환경변수가 설정되었지만 DOCKER_PASS
의 내용은 출력되지 않은 것을 볼 수 있다.
Docker 이미지 푸시
설정이 다 되었으므로 .travis.yml
에 배포 설정에서 이미지를 푸시하면 되는데 푸시하는 명령어가 한 명령어가 아니므로 편의상 docker-deploy.sh
라는 파일을 만든다.
$ cat docker-deploy.sh
docker login -u YOUR_USERNAME -p YOUR_PASSWORD
docker build -t outsideris/demo:0.0.1 .
docker tag outsideris/demo:0.0.1 outsideris/demo:latest
docker push outsideris/demo:0.0.1
docker push outsideris/demo:latest
Travis CI의 배포단계에서 이 스크립트 파일을 실행하도록 지정하면 된다.
...
deploy:
provider: script
script: bash docker-deploy.sh
skip_cleanup: true
on:
repo: outsideris/demo
tags: true
deploy
로 지정했으므로 이는 테스트 등이 성공했을 때만 실행되고 on
부분에서 tags: true
로 지정했으므로 Git에 태그를 푸시했을 때(즉, 릴리스할 때)만 배포된다.
이렇게 설정하면 Git에 태그를 만들어서 푸시하면 CI에서 Docker Hub에 자동으로 이미지를 배포한다.
첫줄에 오토메이트 링크가 잘못 걸린듯 합니다.
수정했습니다. 감사합니다.