GitLab Project Runner
에 등록된 Docker build 시에 내부에 실행된 docker:dind 이미지에서 2375
port로 연결이 안되는 이슈가 발생되었습니다. 기존의 설정은 GitLab Hosted Runner(Instance Runner)에서는 정상 동작되었으나 설정 변경이 필요하였습니다.
우선 dind
는 docker in docker로, Container 내부에서 Docker daemon에 접근하여 새로운 Container를 생성이 가능합니다. 이 방식을 활용해 GitLab Runner 내부에서 docker build 환경을 위한 Container를 새로 기동하여 내부적으로 Stage를 진행합니다.
2375
포트는 Docker daemon에 원격 엑세스할 때 사용하는 tcp 포트입니다.
처음엔 2375와의 통신이 불가한 이유가 Docker 설정을 통해 2375 포트를 오픈을 하는 방식으로 풀어볼까 하였습니다.
systemd에 docker.service 설정 수정을 통해 2375을 로컬호스트나 외부 퍼블릭으로 오픈이 가능합니다.
외부로 오픈하는 경우에는 잠재적 보안 위협이 발생할 수 있습니다..;
vi /lib/systemd/system/docker.service
---
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// -H tcp://127.0.0.1:2375
---
또는
vi /etc/docker/daemon.js 추가
---
{"hosts": ["tcp://127.0.0.1:2375", "unix:///var/run/docker.sock"]}
systemctl daemon-reload
systemctl restart docker.service
그러나 해결되지 않았습니다 '-';;
해결된 내용의 Reference는 다음과 같습니다.
수정을 한 .gitlab-ci.yml 파일은 다음과 같습니다.
- DOCKER_HOST는 tcp://docker:2375 로 동일합니다.
- DOCKER_TLS_CERTDIR는 2376 secure 포트로 통신하지 않으므로 ""로 비웁니다.
- DOCKER_DRIVER는 overlay2로 명시합니다.
- docker:dind 이미지를 활용하는 services를 명시하는 구간에도 --tls=false임을 선언합니다.
- Container Image를 빌드하는 구간에서 services에서는 alias: docker를 추가합니다.
# This file is a template, and might need editing before it works on your project.
# You can copy and paste this template into a new `.gitlab-ci.yml` file.
# You should not add this template to an existing `.gitlab-ci.yml` file by using the `include:` keyword.
#
# To contribute improvements to CI/CD templates, please follow the Development guide at:
# https://docs.gitlab.com/ee/development/cicd/templates.html
# This specific template is located at:
# https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Go.gitlab-ci.yml
image: golang:latest
variables:
REPO_NAME: gitlab.com/xxxx/xxxxx-map-api-server
DOCKER_IMAGE: registry.gitlab.com/xxxx/xxxxx-map-api-server
TAG: $CI_COMMIT_REF_SLUG-$CI_COMMIT_SHA
DOCKER_HOST: tcp://docker:2375 # GitLab hosted Runner
DOCKER_TLS_CERTDIR: ""
DOCKER_DRIVER: overlay2
services:
- name: docker:dind
command: ["--tls=false"]
before_script:
- echo "start job at :" `date`
- echo "workspace is:" `pwd`
after_script:
- echo "done job at :" `date`
stages:
- check
- build
- container-build-push
container-build-push:
image: docker:latest
rules:
- if: $CI_COMMIT_TAG # Run this job when a tag is created
variables:
# using "docker" as the host is only possible if you alias the service below
DOCKER_HOST: tcp://docker:2375
# could be wrong here but although Docker defaults to overlay2,
# Docker-in-Docker (DIND) does not according to the following GitLab doc:
# https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#use-the-overlayfs-driver
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
services:
- name: docker:dind
alias: docker
command: ["--tls=false"]
stage: container-build-push
script:
- docker build --platform linux/x86_64 -t $DOCKER_IMAGE:$TAG .
- docker push $DOCKER_IMAGE:$TAG
before_script:
- echo "$CI_REGISTRY_PASSWORD" | docker login -u "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY
해당 .gitlab-ci.yml을 업데이트 해보고 실패된 Job을 재수행하면 성공적으로 동작되는 것을 확인할 수 있습니다.
최종적으로 빌드된 Container Image가 Registry에 Push 된 것을 확인할 수 있습니다.
감사합니다.
'Git > GitLab' 카테고리의 다른 글
GitLab CI를 활용한 Harbor Registry로 Container Image Push (1) | 2024.08.31 |
---|---|
GitLab Group Runner Docker Container (1) | 2024.07.24 |
GitLab Project Runner using Docker (0) | 2024.07.20 |
GitLab CI Container 이미지 빌드와 GitLab Registry (1) | 2024.07.08 |
GitLab CI Golang 배포 (0) | 2024.07.08 |