프로필사진

Go, Vantage point

가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.


Github | https://github.com/overnew/

Blog | https://everenew.tistory.com/





티스토리 뷰

반응형

 

 

github actions로 폴더마다 다른 도커 image를 build 하고  AWS ECR로 업로드해보자.

 

 

일단 레퍼지토리에서 단 하나의 docker image를 빌드한다면 다른 분이 만든 workflow를 이용하면 쉽다.

https://github.com/jwalton/gh-ecr-push/tree/master

 

GitHub - jwalton/gh-ecr-push: GitHub Action to push a docker image to Amazon ECR.

GitHub Action to push a docker image to Amazon ECR. - GitHub - jwalton/gh-ecr-push: GitHub Action to push a docker image to Amazon ECR.

github.com

 

 

 

문제는 여러 폴더마다 다르게 빌드한 파일을 업로드할 때는 해당 workflow는 오류가 나서 직접 업로드 workflow를 작성해 주어야 한다. 

 

이를 위해 3가지 순서로 설명을 해보자.

1. 폴더마다 다른 Dockerfile로 빌드

2. AWS configure

3. AWS ECR 전송

 

 

 

 

 

 

 

 

1. 폴더(dirctory)마다 다른 Dockerfile로 빌드

 

 

 

메인 레퍼지토리에서 두 가지 dirctory를 대상으로 각각의 도커 이미지를 만들어야 한다면,

docker build 명령어에 dockerfile의 위치를 설정할 수 있다.

 

repository

ㄴ 타켓 _폴더1

    ㄴDockerfile

ㄴ 타켓_폴더2

    ㄴDockerfile

ㄴ .github

 

 

 

name: Build and Push Docker Image
on:
  push:
    branches:
      - main

jobs:
  build-worknet-image:
    runs-on: ubuntu-latest
    env:
      working-directory: <타켓 폴더>

    steps:
    - name: Checkout
      uses: actions/checkout@v2

    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v2

    - run:docker build --tag <이미지 이름>:v1 ./<타켓 폴더>

 

 

 

 

 

 

 

 

 

 

 

2. AWS configure

 

image를 만들었다면 ECR에 업로드만 하면 된다.

AWS CLI를 사용하려면 일단 로그인이 필요하다.

 

이때 사용하는 아이디는 console에 로그인할 때 사용하는 것이 아니라, ECR에 접근 권한을 부여한 IAM user의 id와 password이다.

사용자를 만들고

 

AmazonEC2ContainerRegistryFullAccess 에 대한 권한을 부여하자.

 

 

 

사용자의 보안 자격 증명 탭에서 액세스 키를 만들자.

 

 

 

 

 

 

 

 

여기서 만든  액세스 키의 id와 password가 cli 로그인에 사용된다.

이 데이터는 코드 상에 노출되면 안 되기 때문에 github 레포지토리의 setting에 secrets and variables에 들어가서 github action에 사용할 비밀 변수로 등록해 주자.

 

 

 

 

 

 

 

 

이제 AWS configure는 aws가 제공해 주는 action(aws-actions/configure-aws-credentials@v1)을 사용하면, 저장해 둔 변수를 넘겨서 편하게 로그인할 수 있다.

 

- name: Configure AWS credentials
  uses: aws-actions/configure-aws-credentials@v1
  with:
    aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
    aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
    aws-region: ap-northeast-2

 

 

 

 

 

 

 

 

 

3. AWS ECR 전송

 

 

여러 가지 명령어를 실행해 주어야 하기 때문에 ECR 전송이 가장 애먹은 부분이다.

 

- name: send to ECR
  env:
    working-directory: <타겟 폴더>
  run : |
    aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin ${{ secrets.AWS_ECR_ID }}.dkr.ecr.ap-northeast-2.amazonaws.com 
    docker tag <빌드된 이미지 이름>:v1 ${{ secrets.AWS_ECR_ID }}.dkr.ecr.ap-northeast-2.amazonaws.com/<ECR 리퍼지토리 이름>:v1 
    docker push ${{ secrets.AWS_ECR_ID }}.dkr.ecr.ap-northeast-2.amazonaws.com/<ECR 리퍼지토리 이름>:v1

 

 

 

 

특히  aws ecr get-login-password와 docker login 명령어는 | 를 통해서 파이프 설정을 해주어야 한다.

 

 

파이프(|)는 왼쪽 명령어의 결과를 오른쪽 명령어의 input으로 전달해 준다.

docker login --username AWS --password-stdin  의 stdin이 바로 input을 받아오는 것을 의미한다.

 

 

aws ecr get-login-password는 AWS CLI는 인증 절차를 간소화하는 명령어 이다.

이 명령어를 실행하면 12시간 동안 유효한 문자열 토큰을 받을 수 있다. 이 토큰이 input으로 들어가게 된다.

 

이런 식으로 인증 절차를 생략해주는 토큰이 발행된다.

 

 

 

 

이 명령어에서 사용한 변수는 ECR 리포지토리의 URI의 앞에 붙는 aws_account_id이다. 

 

 

 

docker login --username AWS --password-stdin ${{ secrets.AWS_ECR_ID }}.dkr.ecr.ap-northeast-2.amazonaws.com 

 

aws_account_id 모른다면 리퍼지토리의 URI에 앞에 있으니 복붙 해주면 된다.

 

 

 

 

 

 

 

 

이제 build 한 image를 ECR 리퍼지토리 URI에 맞게 tag를 붙여주어야, 오류가 나지 않는다.

 

docker tag <빌드된 이미지 이름>:v1 ${{ secrets.AWS_ECR_ID }}.dkr.ecr.<리전명>.amazonaws.com/<리퍼지토리 이름>:v1

 

 

 

이 명령어는 즉 아래 명령어와 동일하다.

docker tag <빌드된 이미지 이름>:v1 <리퍼지토리 URL>:v1

 

 

 

 

이제 docker push 명령어로 ECR에 업로드해주자.

docker push ${{ secrets.AWS_ECR_ID }}.dkr.ecr.<리전명>.amazonaws.com/<리퍼지토리 이름>:v1

 

 

 

 

 

 

 

이 3가지 방식을 각각의 폴더에 적용하면 여러 개의 이미지를 한 번에 빌드해서 업로드할 수 있다.

 

github action에서 job은 병렬로 처리해 주기 때문에 각각의 docker image가 병렬처리로 빠르게 빌드되고 업로드할 수 있다.

각각이 독립적으로 실행된다.

 

 

 

 

 

 

 

전체 workflow 예시 코드

 

 

 

 

반응형
댓글
반응형
인기글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함