Docker: Переопределение Entrypoint включает спецификацию CMD? - PullRequest
0 голосов
/ 14 ноября 2018

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

Я должен персонализировать образ 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 Ответ

0 голосов
/ 14 ноября 2018

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

...