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.