Docker:Entrypoint 的覆盖是否涉及 CMD 规范?

9
这是一个纯好奇的问题:
我需要个性化定制一个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:

最后我的问题:

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

请注意,CMD ["php-fpm"]在原始镜像中是相同的。


如果您的Docker文件中没有CMD [ "php-fpm" ],那么能否为我执行 docker exec -it containerName sh 命令,并检查 docker-php-entrypoint 的位置,应该位于 /usr/local/bin/docker-php-entrypoint 等位置。假设这个位置发生了变化,请比较差异。否则,请尝试输出 $@ 的确切内容,以查看差异所在。 - Shardj
1个回答

8
这是继承前一张镜像的值时的一个异常情况。如果父镜像定义了一个 CMD,而你的镜像定义了一个ENTRYPOINT,那么 CMD 的值将被清空。在所有其他的情况下,你应该从父镜像中继承 ENTRYPOINTCMD,它们不会改变。关于这个决定背后的逻辑,请参阅issue 5147

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接