Docker: Переопределение Entrypoint включает спецификацию CMD?

Это вопрос для моего чистого любопытства:

Я должен персонализировать образ Docker, в частности это фрагмент моего dockerfile:

ARG DEFAULT_PHP_VERSION
FROM php:${DEFAULT_PHP_VERSION:+${DEFAULT_PHP_VERSION}-}fpm-alpine
# RUN some personal stuff
RUN rm -rf /var/www/html

# Set proper Entrypoint
COPY build/fs/usr/local/bin/my-entrypoint.sh /usr/local/bin/my-entrypoint.sh
RUN chmod +x /usr/local/bin/my-entrypoint.sh
ENTRYPOINT [ "my-entrypoint.sh" ]

WORKDIR /var/www

а также my-entrypoint.sh является:

#!/bin/sh

set -e

echo "Trying my-entrypoint with args: $@"

if [ ! -z "$XDEBUG_ENABLED" ] ; then
    echo "Enabling XDEBUG"
    docker-php-ext-enable xdebug
fi

# execute default entrypoint
echo "Execute Main:"
docker-php-entrypoint $@
echo "Main Done"

исходное изображение PHP-FPM-ALPINE у которого есть команда

CMD [ "php-fpm" ]

Моя проблема в том, что когда я запускаю этот образ (хорошо, мы правильно запускаем контейнеры, а не изображения, я знаю), команда по умолчанию не передается my-entrypoint.shна самом деле вывод:

Trying my-entrypoint with args: 
Enabling XDEBUG
Execute Main:
Main Done

То есть ENTRYPOINT не получает команду по умолчанию php-fpmи так основной процесс автоматически останавливается.

НО, если я изменю dockerfile, добавив CMD в конце:

ARG DEFAULT_PHP_VERSION
FROM php:${DEFAULT_PHP_VERSION:+${DEFAULT_PHP_VERSION}-}fpm-alpine
# RUN some personal stuff
RUN rm -rf /var/www/html

# Set proper Entrypoint
COPY build/fs/usr/local/bin/my-entrypoint.sh /usr/local/bin/my-entrypoint.sh
RUN chmod +x /usr/local/bin/my-entrypoint.sh
ENTRYPOINT [ "my-entrypoint.sh" ]
CMD ["php-fpm"]

WORKDIR /var/www

и все идет правильно (то есть CMD передается точке входа):

Trying my-entrypoint with args: php-fpm
Enabling XDEBUG
Execute Main:

Напоследок мой вопрос:

почему я должен переопределить CMD ["php-fpm"] если я изменю ENTRYPOINT Директива?

Обратите внимание, что CMD ["php-fpm"] то же самое в оригинальном изображении.

1 ответ

Это один из исключительных случаев при наследовании значений из предыдущего изображения. Если родительское изображение определяет CMDи ваше изображение определяет ENTRYPOINTтогда значение CMD обнуляется. Во всех других сценариях вы должны увидеть ENTRYPOINT а также CMD наследуется от родительских изображений без изменений. Логика этого решения приведена в выпуске 5147.

Другие вопросы по тегам