Publikowanie obrazów docker z Gitlab na AWS ECR

Zastanawialiście się kiedyś, gdzie można publikować swoje obrazy dockerowe poza Docker Hub? Jednym z takich miejsc jest AWS ECR, czyli Elastic Container Registry. W poniższym artykule pokaże, jak budować obraz dockerowy przy pomocy Gitlab CI/CD oraz jak publikować go w repozytorium AWS ECR.

1. Wymagania

Aby móc swobodnie działać na Gitlab, potrzebujemy stworzyć repozytorium o dowolnej nazwie. Dodatkowo oprócz tego, do „Variables” w repozytorium Gitlab musimy dodać 3 zmienne, są to:

  1. AWS_ACCESS_KEY_ID
  2. AWS_SECRET_ACCESS_KEY
  3. AWS_DEFAULT_REGION

Bez nich nie będziemy w stanie nic zdziałać. W jaki sposób dodawać zmienne do repozytorium, to odeślę do dokumentacji Gitlab, która wszystko wyjaśnia https://docs.gitlab.com/ee/ci/variables/#for-a-project
Oprócz tego, potrzebujemy jeszcze utworzyć repozytorium ECR na AWS, w tym celu musimy mieć lokalnie zainstalowane oraz skonfigurowane AWS CLI, jak je zainstalować odsyłam do dokumentacji AWS https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html

Nowe repozytorium tworzymy za pomocą polecenia

aws ecr create-repository --repository-name gitlab-images

Ja swoje nazwałem gitlab-images, ale nazwa jest dowolona, jednak później będzie trzeba ją dodać do pipeline. Zapiszcie sobie gdzieś repositoryArn, bo będzie nam zaraz potrzebne.

2. Utworzenie Dockerfile

Kolejną rzeczą jaką potrzebujemy w naszym repozytorium, jest plik Dockerfile, na podstawie którego pipeline zbuduje nam obraz. Ja użyłem prostego Dockerfile, który buduje obraz z nginx:alpine i wystawia go na porcie 80.

FROM nginx:alpine

EXPOSE 80

Oczywiście, możecie również dodać swój Dockerfile, na etapie testu CI/CD nie ma to większego znaczenia, najważniejsze, żeby było co budować 😀

3. Tworzenie pipeline

Ostatnią rzeczą, jaką musimy utworzyć jest pipeline, który zbuduje i spushuje nam obraz do ECR. Pipeline musi być w pliku .gitlab-ci.yml, więc go utwórzmy i dodajmy do niego poniższy kod

stages:
  - build
variables:
  DOCKER_REGISTRY: 177394270612.dkr.ecr.eu-central-1.amazonaws.com
  APP_NAME: gitlab-images

publish:
  stage: build
  image:
    name: docker:latest
  services:
    - docker:19-dind
  before_script:
    - apk add --no-cache curl jq python3 py3-pip
    - pip install awscli
    - aws ecr get-login-password | docker login --username AWS --password-stdin $DOCKER_REGISTRY
  script:
    - docker build -t $DOCKER_REGISTRY/$APP_NAME:$CI_PIPELINE_IID .
    - docker push $DOCKER_REGISTRY/$APP_NAME:$CI_PIPELINE_IID

W variables, musimy ustawić DOCKER_REGISTRY, tutaj wstawiamy repositoryArn w takim formacie jak ja, bez nazwy repozytorium, natomiast nazwę repozytorium ustawiamy w zmiennej APP_NAME. I to tyle 🙂 Pipeline odpala nam instalację AWS CLI, instaluje środowisko dockera w dockerze(dind – docker in docker), buduje obraz z pliku Dockerfile, taguje go, oraz pushuje do AWS ECR.

4. Testowanie pipeline oraz weryfikacja buildu

Aby przetestować czy działa nasz pipeline, mamy 2 opcje, albo wpuścić jakieś zmiany na repozytorium, chociażby pusty plik test.txt, lub uruchomić go, za pomocą zakładki Build > Pipeline. Wynikiem powinien być obraz umieszczony w ECR oraz komunikat w pipeline Job succeeded, lub ogólnie pipeline ze statusem passed. Aby sprawdzić, czy obraz został opublikowany w ECR, możemy wykonać poniższe polecenie

aws ecr list-images --repository-name gitlab-images

Powyższe polecenie wylistuje nam listę obrazów dla repozytorium wraz z ich tagami, najnowszy obraz będzie pierwszy w kolejności 🙂 Mam nadzieję, że powyższy poradnik komuś się przyda 🙂