Docker:入口点的覆盖涉及CMD规范?

Sim*_*Sca 10 docker dockerfile docker-entrypoint

这是我纯粹好奇的问题:

我必须个性化 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
Run Code Online (Sandbox Code Playgroud)

并且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"
Run Code Online (Sandbox Code Playgroud)

原始图像PHP-FPM-ALPINE具有命令

CMD [ "php-fpm" ]
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我运行这个图像时(好吧,我们正确运行容器,而不是图像,我知道),默认命令没有传递给my-entrypoint.sh,实际上输出是:

Trying my-entrypoint with args: 
Enabling XDEBUG
Execute Main:
Main Done
Run Code Online (Sandbox Code Playgroud)

也就是说 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
Run Code Online (Sandbox Code Playgroud)

一切顺利(即 CMD 被传递到入口点):

Trying my-entrypoint with args: php-fpm
Enabling XDEBUG
Execute Main:
Run Code Online (Sandbox Code Playgroud)

最后我的问题是:

CMD ["php-fpm"]为什么如果我更改指令我必须重新声明ENTRYPOINT

请注意,这CMD ["php-fpm"]与原始图像中的相同。

BMi*_*tch 9

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