Как избежать конфликта порта с текущим контейнером, пока gitlab-runner выполняет задание

Я пытаюсь развернуть свое приложение с помощью gitlab-runner.

Вот скрипт .gitlab-ci.yml:

stages:
  - build
  - deploy

image: docker:20

variables:
  IMAGE_NAME: front:$CI_COMMIT_REF_NAME

build:
  stage: build
  when: manual
  script:
    - docker build -t $IMAGE_NAME .
    - docker run -dp 80:80 $IMAGE_NAME
  only:
    - master
    - tags
  tags:
    - front

После первого выполнения все в порядке, у меня есть работающий контейнер с моим приложением. Но при следующем выполнении задания я получаю сообщение об ошибке:

$ docker run -dp 80:80 $IMAGE_NAME
956d5a27449df0d38db357256fb96cf8cab8ba689d05fda21e54552bbe93fb7a
docker: Error response from daemon: driver failed programming external connectivity on endpoint frosty_elion (d89b1f150968331727a7c00823c28f3ab6a80f7882d659fce3520834005ad197): Bind for 0.0.0.0:80 failed: port is already allocated.
Cleaning up file based variables
ERROR: Job failed: exit code 125

Вопрос: как избежать конфликта с запущенным контейнером, который все еще использует требуемый порт?

Вот gitlab-runner config.toml:

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "name"
  url = "url"
  token = "token"
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "docker:latest"
    privileged = true
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
    shm_size = 0


person AksenovAN    schedule 14.03.2021    source источник


Ответы (1)


Сценарий сборки не будет автоматически очищать запущенные вами контейнеры. Вы должны убедиться, что контейнер остановлен следующим образом:

build:
  stage: build
  when: manual
  script:
    - docker build -t $IMAGE_NAME .
    - (docker stop test_deployment_80 || true)
    - docker run -dp --rm --name test_deployment_80 80:80 $IMAGE_NAME
  only:
    - master
    - tags
  tags:
    - front

Здесь я добавляю --rm в контейнер, чтобы указать docker удалить контейнер, когда он остановлен. Кроме того, я добавил --name, чтобы иметь узнаваемое имя работающего контейнера. Я использую имя в предыдущей команде, чтобы остановить контейнер перед запуском нового.

person jordanvrtanoski    schedule 15.03.2021