glaphire
@glaphire
PHP developer

Почему PHP CLI контейнер сам останавливается в docker?

Разделила окружение php на php-fpm и php-cli для проекта через docker-compose.
Не понимаю, почему php-cli сразу после запуска останавливается без ошибок:
dariia@asusx:~/Code/php/symfony5_tutorials$ docker-compose up --force-recreate php-cli
Recreating symfony5_tutorials_php-cli_1 ... done
Attaching to symfony5_tutorials_php-cli_1
php-cli_1     | Interactive shell
php-cli_1     | 
symfony5_tutorials_php-cli_1 exited with code 0

Как должно быть правильно? Как мне спокойно работать с контейнером и выполнять операции внутри него (композер запускать, воркеры держать)?

Моя конфигурация:
docker-compose.yml

version: "3"
services:
    nginx:
        image: nginx:latest
        ports:
            - "8080:80"
        volumes:
            - .:/app
            - ./docker/nginx/site.conf:/etc/nginx/conf.d/default.conf
        depends_on:
            - php-fpm
        working_dir: /app
    php-fpm:
        working_dir: /app
        build:
            context: ./docker/php-fpm
            dockerfile: Dockerfile
        volumes:
            - .:/app
            - ./docker/php-fpm/log/php-error.log:/var/log/error.log
        ports:
            - '9000:9000'
    php-cli:
        working_dir: /app
        build:
            context: ./docker/php-cli
            dockerfile: Dockerfile
        volumes:
            - ./docker/php-cli/log/php-error.log:/var/log/error.log


php.ini for CLI

memory_limit = 1024M
error_reporting = E_ALL
display_errors = On
log_errors = On
html_errors = Off
error_log = /var/log/error.log


Dockerfile

FROM php:7.3.6-cli

RUN apt-get update \
    && apt-get upgrade -y \
    && apt-get install -y git \
    && apt-get install -y libfreetype6-dev libjpeg62-turbo-dev libpng-dev libxslt-dev libpq-dev unzip\
    && docker-php-ext-install -j$(nproc) iconv \
    && docker-php-ext-install ctype \
    && docker-php-ext-install mysqli pdo pdo_mysql \
    && docker-php-ext-enable pdo_mysql \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd \
    && docker-php-ext-install xsl \
    && pecl install xdebug-2.7.2 \
    && docker-php-ext-enable xdebug

COPY xdebug.ini /usr/local/etc/php/conf.d/xdebug.ini
COPY php.ini /usr/local/etc/php/conf.d/php.ini

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/bin --filename=composer --quiet

WORKDIR /app

  • Вопрос задан
  • 103 просмотра
Решения вопроса 2
OnYourLips
@OnYourLips
Вы меня пригласили, как эксперта.

Не помимаю, почему php-cli сразу после запуска останавливается без ошибок:
А почему не должен? Главный процесс в cli успешно запустился, поэтому и контейнер завершается.

Как сделать правильно? Убрать cli из docker-compose манифеста. Если надо выполнить какую-то команду в cli, то делается это через "docker-compose exec php-fpm php ..." или через docker run/exec.

И еще, как вы могли заметить из предыдущего абзаца, отдельный образ для cli не нужен. Простой используйте ваш php-fpm образ (или процесс на нём) и передавайте ему команду.
Ответ написан
@flashyua
Контейнер живет, пока работает "основной" процесс в нем, указанный как CMD. В php-cli контейнере таким процессом является интерпретатор php, но он закрывается сразу после запуска.
Обычно, в cli контейнерах нужно запускать какую-то конкретную команду, после выполнения которой контейнер будет останавливаться.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы