gitlab-ci. Проблема со сборкой docker compose в shell с использованием gitlab-runner
Встала задача написать автоматическую сборку и публикацию проекта в docker compose с последующим запуском. Для этого я выполнил следующие шаги:
- В gitlab, запущенном на моём сервере создал, зарегистрировал и запустил 2 раннера (один docker, второй shell).
- настроил config.toml для этих ранеров, после чего он приобрёл следующий вид:
concurrent = 1 check_interval = 0 shutdown_timeout = 0 [session_server] session_timeout = 1800 [[runners]] name = "docker-runner" url = "http://gitlab.my.host123" id = 50 token = "TOKEN-hidden" token_obtained_at = 2023-07-27T12:16:48Z token_expires_at = 0001-01-01T00:00:00Z executor = "docker" [runners.docker] tls_verify = false image = "docker:stable" privileged = true disable_entrypoint_overwrite = false oom_kill_disable = false disable_cache = false volumes = ["/cache"] shm_size = 0 [[runners]] name = "shell" url = "http://gitlab.my.host123" id = 51 token = "TOKEN-hidden" token_obtained_at = 2023-07-27T12:17:46Z token_expires_at = 0001-01-01T00:00:00Z executor = "shell" [runners.custom_build_dir] enabled = true [runners.cache] MaxUploadedArchiveSize = 0
- На сервере с gitlab выдал пользователю gitlab-runner права на доступ к docker с помощью команды:
usermod -aG docker gitlab-runner
в /etc/sudoers
Из папки
/home/gitlab-runner/
удалил файлы.bashrc, .profile, .bash_logout
Написал
gitlab-ci.yml
со следующим содержимым:
.docker:
image: docker:latest
services:
- name: docker:dind
alias: docker
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_DRIVER: overlay2
DOCKER_TLS_CERTDIR: ""
stages:
- build
- deploy
build:
stage: build
tags:
- docker
extends:
- .docker
script:
- docker pull api.$CONTAINER_NAME:latest || true
- >
docker build
--pull
--cache-from api.my.host123/$CONTAINER_NAME:latest
--build-arg ASPNETCORE_ENVIRONMENT="Prod"
--tag api.my.host123/$CONTAINER_NAME:${CI_COMMIT_SHA}
--tag api.my.host123/$CONTAINER_NAME:latest
./MyProject.WebApi
only:
- main
- production
deploy:
stage: deploy
tags:
- shell
script:
- mkdir -p ~/deploy
- cp -i docker-compose.production.yml ~/deploy/docker-compose.yml
- docker compose down --remove-orphans
- docker compose pull
- docker compose -f docker-compose.yml up -d
only:
- main
- production
- В проекте на asp.net создал Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
WORKDIR /app
EXPOSE 7155
ENV ASPNETCORE_URLS=http://+:7155
RUN adduser -u 5678 --disabled-password --gecos "" appuser && chown -R appuser /app
USER appuser
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build
WORKDIR /src
COPY ["MyProject.WebApi.csproj", "./"]
RUN dotnet restore "MyProject.WebApi.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "MyProject.WebApi.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "MyProject.WebApi.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyProject.WebApi.dll"]
и два файла docker-compose:
- docker-compose.production.yml
version: '3.3'
services:
webapi_myproject:
image: mcr.microsoft.com/dotnet/sdk:7.0
container_name: webapi_myproject
ports:
- "7155:7155"
expose:
- "7155"
restart:
unless-stopped
- и docker-compose.yml
version: '3.3'
services:
webapi_myproject:
build:
context: ./MyProject.WebApi
dockerfile: Dockerfile
container_name: webapi_myproject
ports:
- "7155:7155"
expose:
- "7155"
restart:
unless-stopped
После публикации и запуска docker-runner'ов я получаю следующий результат:
В build всё выглядит действительно хорошо и образ проекта создаётся на диске сервера
А вот в deploy...
docker.errors.DockerException: Error while fetching server API version: HTTPConnectionPool(host='docker', port=2375): Max retries exceeded with url: /version (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f612d4ea560>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))
Если я добавляю в gitlab-ci.yml
before_script: docker version
deploy:
stage: deploy
tags:
- shell
before_script:
- docker version
script:
- mkdir -p ~/deploy
- cp -i docker-compose.production.yml ~/deploy/docker-compose.yml
- docker compose down --remove-orphans
- docker compose pull
- docker compose -f docker-compose.yml up -d
only:
- main
- production
То вижу уже следующую ошибку:
error during connect: Get "http://docker:2375/v1.24/version": dial tcp: lookup docker on 127.0.0.53:53: server misbehaving
Если все команды из deploy я выполняю на сервере в консоли, то контейнер создаётся и всё работает так, как мне и нужно. Здесь же я подозреваю, что проблема в докере, но знаний и опыта не хватает понять причину. Буду благодарен за любую помощь и наводки в решении данной проблемы!