りんごとバナナとエンジニア

エンジニア修行の記録

【GitHub Actions】docker-build-pushでECRにimageをpushする

GitHub Actionsでworkflowを書くとき、imageをビルドしてECRにpushする処理を書く機会が多い。今までは以下の様に書いていた。

jobs:
  build:
    name: Build and push Docker image
    runs-on: ubuntu-latest
    env:
      IMAGE_NAME: ${{ secrets.CONTAINER_REGISTRY_PATH }}/path/to/ecr/repo
      IMAGE_TAG: ${GITHUB_SHA}
    steps:
    - uses: actions/checkout@master
    - name: Login to ECR
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
      run: $(aws ecr get-login --no-include-email)
    - name: Build image
      run: docker build -t ${IMAGE_NAME}:${IMAGE_TAG} .
    - name: Push image
      run: docker push ${IMAGE_NAME}:${IMAGE_TAG}

しかし先日、良さそうなライブラリを教えてもらった。

github.com

Docker Imageのビルドからレポジトリへのログイン・pushまでを行ってくれるライブラリで、push先もDockerHub, GCR, ECR, GitHub Docker Registryに対応している。
ECRにpushする場合は以下のように書ける。

jobs:
  build:
    name: Build and push Docker image
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@master
    - uses: mr-smithers-excellent/docker-build-push@v4
      name: Build & push Docker image
      with:
        image: path/to/ecr/repo
        tag: ${GITHUB_SHA}
        registry: ${{ secrets.CONTAINER_REGISTRY_PATH }}
      env:
        AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
        AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

docker image関連のステップ数を大幅に減らすことができ、workflowが見やすくなる。

念のためコードも確認してみる。

docker-build-push/docker.js at master · mr-smithers-excellent/docker-build-push · GitHub

docker関連の処理はdocker.jsに記述されている。ECRの場合 aws ecr get-login でログインを行い、その後 docker build , docker push を行うというよくある処理になっている。