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
문제는 여러 폴더마다 다르게 빌드한 파일을 업로드할 때는 해당 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이다.
여기서 만든 액세스 키의 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 예시 코드
'개발 > Docker' 카테고리의 다른 글
Docker Hub에 Docker Image 업로드하기 (0) | 2024.02.28 |
---|---|
Ubuntu Docker DNS 컨테이너 올리기 (forwaders 사용) (3) | 2024.02.28 |
[Virtual Box] Ubuntu에 Jenkins container 올리고 접속하기 (0) | 2024.02.28 |
Docker exec와 attach의 차이 (docker run) (0) | 2024.02.21 |
Docker에서 Selenium (4.10 & 4.11) 실행시키기 (0) | 2023.08.15 |