Вопрос или проблема
При выполнении команды 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
на контейнере, который остановлен. Давайте рассмотрим несколько шагов по устранению этой проблемы.
Причины ошибки
-
Контейнер остановлен: Проблема заключается в том, что вы выполняете команду
docker exec
на контейнере, который уже не работает. Это может произойти, если ваш контейнер был завершен до выполнения команды. -
Ошибки в инициализации контейнера: Возможны проблемы с конфигурацией Docker Compose, которые не позволяют контейнеру запуститься корректно.
Решения
-
Проверьте состояние контейнера:
Добавьтеdocker ps -a
для проверки статуса всех контейнеров после выполнения командыdocker-compose up -d
. Это позволит вам увидеть, запущен ли контейнерapp-php
и есть ли ошибки его запуска.- docker-compose up -d --remove-orphans --no-recreate - docker ps -a
-
Логи контейнера:
Если контейнерapp-php
остановлен, выполните командуdocker-compose logs php
, чтобы просмотреть логи и выяснить, почему контейнер не запускается.- docker-compose logs php
-
Обновите команду
docker exec
:
Если контейнер действительно запущен, убедитесь, что вы корректно указываете имя контейнера. Например, в вашем случае, команда должна выглядеть так:- docker exec -u usr app-php php -v
-
Перезапустите контейнер:
Если ошибка с контейнером сохраняется, попробуйте перезапустить его с помощью:- docker-compose down - docker-compose up -d
-
Проверка Docker Compose:
Убедитесь, что ваш файлdocker-compose.yml
корректен. Проверьте на наличие опечаток, отсутствие необходимых параметров и прочие ошибки. -
Используйте команду
docker-compose exec
вместоdocker exec
:
Если вы работаете с Docker Compose, вместоdocker exec
рекомендуется использоватьdocker-compose exec
:- docker-compose exec php php -v
Резюме
Убедитесь, что контейнер app-php
запущен перед выполнением команды docker exec
. Проверьте логи и статус контейнера для выявления причин остановки. С помощью предложенных шагов вы сможете успешно устранить проблему и выполнить команду внутри работающего контейнера.