这是一个纯好奇的问题:
我需要个性化定制一个Docker镜像,特别是这是我的dockerfile的一部分:
原始镜像是
那就是ENTRYPOINT没有接收到默认命令php-fpm,因此主进程会自动停止。
但是如果我修改Dockerfile,在末尾添加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:
最后我的问题:
如果我更改了ENTRYPOINT
指令,为什么我必须重新声明CMD ["php-fpm"]
?
请注意,
CMD ["php-fpm"]
在原始镜像中是相同的。
docker exec -it containerName sh
命令,并检查 docker-php-entrypoint 的位置,应该位于 /usr/local/bin/docker-php-entrypoint 等位置。假设这个位置发生了变化,请比较差异。否则,请尝试输出 $@ 的确切内容,以查看差异所在。 - Shardj