任务是在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
V/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.生产.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-runners 后,我得到以下输出:
在构建中,一切看起来都非常好,并且项目映像是在服务器磁盘上创建的
在这里部署...
docker.errors.DockerException:获取服务器 API 版本时出错:HTTPConnectionPool(host='docker', port=2375): url 超出最大重试次数:/version (由 NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7f612d4ea560> 引起) : 无法建立新连接: [Errno -3] 名称解析暂时失败'))
Если я добавляю в 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 я выполняю на сервере в консоли, то контейнер создаётся и всё работает так, как мне и нужно. Здесь же я подозреваю, что проблема в докере, но знаний и опыта не хватает понять причину. Буду благодарен за любую помощь и наводки в решении данной проблемы!























