Не удается запустить контейнер, который остановился: неизвестно

Вопрос или проблема

При выполнении команды docker exec в Gitlab CI runner возникает следующая ошибка:

введите описание изображения здесь

Gitlab CI

image:
    name: docker:latest
stages:
    - build
build app:
    script:
        - cd app
        - docker -v
        - docker-compose -v
        - docker-compose pull --quiet --ignore-pull-failures
        - docker-compose up -d --remove-orphans --no-recreate
        - docker ps
        - docker exec -u usr app-php php -v
    stage: build
    tags:
        - docker

Docker compose

version: "3.7"
services:
    php:
        image: 'docker.domain.fr/docker/docker-registry/php:8.1'
        container_name: 'app-php'
        environment:
            DOCKER_USER_UID: 1000
            DOCKER_USER_GID: 1000
        ports:
            - '8990:80'
        working_dir: '/application'
        volumes:
            - '.:/application:delegated'
            - './nginx.conf:/etc/nginx/conf.d/default.conf'

Runner

...
[[runners]]
    name = "run01-docker"
    executor = "docker"
    ...
    [runners.docker]
        ...
        image = "docker:latest"
        privileged = true
        ...
        volumes = ["/var/run/docker.sock:/var/run/docker.sock",...]

Застрял на этом. Любые идеи приветствуются.

Ответ или решение

Ошибка "Cannot exec a container that has stopped: unknown" возникает, когда вы пытаетесь выполнить команду docker exec на контейнере, который остановлен. Давайте рассмотрим несколько шагов по устранению этой проблемы.

Причины ошибки

  1. Контейнер остановлен: Проблема заключается в том, что вы выполняете команду docker exec на контейнере, который уже не работает. Это может произойти, если ваш контейнер был завершен до выполнения команды.

  2. Ошибки в инициализации контейнера: Возможны проблемы с конфигурацией Docker Compose, которые не позволяют контейнеру запуститься корректно.

Решения

  1. Проверьте состояние контейнера:
    Добавьте docker ps -a для проверки статуса всех контейнеров после выполнения команды docker-compose up -d. Это позволит вам увидеть, запущен ли контейнер app-php и есть ли ошибки его запуска.

    - docker-compose up -d --remove-orphans --no-recreate
    - docker ps -a
  2. Логи контейнера:
    Если контейнер app-php остановлен, выполните команду docker-compose logs php, чтобы просмотреть логи и выяснить, почему контейнер не запускается.

    - docker-compose logs php
  3. Обновите команду docker exec:
    Если контейнер действительно запущен, убедитесь, что вы корректно указываете имя контейнера. Например, в вашем случае, команда должна выглядеть так:

    - docker exec -u usr app-php php -v
  4. Перезапустите контейнер:
    Если ошибка с контейнером сохраняется, попробуйте перезапустить его с помощью:

    - docker-compose down
    - docker-compose up -d
  5. Проверка Docker Compose:
    Убедитесь, что ваш файл docker-compose.yml корректен. Проверьте на наличие опечаток, отсутствие необходимых параметров и прочие ошибки.

  6. Используйте команду docker-compose exec вместо docker exec:
    Если вы работаете с Docker Compose, вместо docker exec рекомендуется использовать docker-compose exec:

    - docker-compose exec php php -v

Резюме

Убедитесь, что контейнер app-php запущен перед выполнением команды docker exec. Проверьте логи и статус контейнера для выявления причин остановки. С помощью предложенных шагов вы сможете успешно устранить проблему и выполнить команду внутри работающего контейнера.

Оцените материал
Добавить комментарий

Капча загружается...