5

这是一个纯粹出于好奇的问题:

我必须个性化一个 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,所以主进程自动停止。

但是如果我修改 dockerfileCMD在最后添加:

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"]在原始图像中是相同的。

4

1 回答 1

4

这是从前一个图像继承值时的例外情况之一。如果父图像定义了 a CMD,而您的图像定义了 a ENTRYPOINT,那么 的值将CMD被清空。在所有其他情况下,您应该看到ENTRYPOINTCMD从父图像继承不变。有关此决定背后的逻辑,请参阅issue 5147

于 2018-11-14T12:15:04.363 回答