Docker: переопределение точки входа связано со спецификацией CMD?

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

Мне нужно персонализировать образ Docker, в частности, это выдержка из моего файла docker:

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, поэтому основной процесс автоматически останавливается.

НО, если я изменю файл докеров, добавив 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"] совпадает с исходным ИЗОБРАЖЕНИЕМ.


person Sim Sca    schedule 14.11.2018    source источник
comment
Не имея CMD [ php-fpm ] в вашем файле докера, можете ли вы docker exec -it containerName sh для меня проверить, что такое docker-php-entrypoint, он должен находиться где-то вроде /usr/local/bin/docker-php-entrypoint. Предположительно это меняется, сравните различия. В противном случае попробуйте вывести именно то, что означает $@, чтобы увидеть, в чем разница.   -  person Shardj    schedule 14.11.2018
comment


Ответы (1)


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

person BMitch    schedule 14.11.2018