Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Travis CI에서 Docker Hub에 이미지 푸시하기

며칠 전에 DockerHub의 Automated Build에 대해서 글을 썼는데 보통은 이를 이용해서 Docker 이미지를 배포하면 된다. 하지만 Docker 이미지를 빌드하기 전에 추가 작업이 필요하다거나 DockerHub를 쓸 수 없는 상황이라면 CI 등에서 직접 빌드해서 푸시해야 한다. 나 같은 경우는 Automated Build의 존재를 몰라서 CI를 그동안 이용하고 있었는데 나중에도 쓸 일이 있을 것 같아서 정리해 둔다.

Docker 이미지 빌드 및 푸시

Docker 이미지를 빌드한 뒤에 Docker Hub에 푸시하려면 다음과 같은 과정을 진행하게 된다.

  1. Docker Hub에 로그인한다.
  2. Dockerfile로 이미지를 빌드한다.
  3. 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에서 빌드를 돌릴 때 자동으로 복호화되어 환경변수로 설정된다.

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에 자동으로 이미지를 배포한다.

2018/07/13 03:36 2018/07/13 03:36