Docker 码头工人:入口点';什么是CMD规范?

Docker 码头工人:入口点';什么是CMD规范?,docker,dockerfile,docker-entrypoint,Docker,Dockerfile,Docker Entrypoint,这是我纯粹好奇的一个问题: 我必须对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

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

我必须对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
也就是说,入口点不接收默认命令
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被传递到entrypoint):

最后,我的问题是: 如果我更改
ENTRYPOINT
指令,为什么我必须重新声明
CMD[“php fpm”]

请注意,
CMD[“php fpm”]
在原始图像中是相同的


这是从以前的图像继承值时出现的异常情况之一。如果父映像定义了一个
CMD
,而您的映像定义了一个
入口点
,则
CMD
的值为空。在所有其他场景中,您应该看到继承自父映像的
ENTRYPOINT
CMD
没有改变。有关此决定背后的逻辑,请参见。

如果docker文件中没有CMD[“php fpm”],您可以
docker exec-它包含名称sh
,并检查docker php入口点是什么,应该位于/usr/local/bin/docker php入口点之类的位置。假设这正在改变,比较一下差异。否则,请尝试准确输出$@的内容,以查看有何区别。可能重复:
Trying my-entrypoint with args: php-fpm
Enabling XDEBUG
Execute Main: