Docker容器执行自定义与原Entrypoint后异常退出及配置优化咨询
问题分析与解决方案
当前方案的可行性
你的动态配置思路是完全可行的,核心问题出在自定义entrypoint脚本执行原entrypoint的方式上,导致容器执行完所有脚本后直接退出(退出码0说明是正常结束,而非异常崩溃)。
解决容器意外退出的关键
容器的生命周期依赖PID 1进程,如果你在自定义脚本中直接调用原entrypoint(比如docker-php-entrypoint),原entrypoint执行完成后会回到脚本进程,脚本执行结束后容器就会随之退出。正确的做法是用exec "$@"替换当前脚本进程为原entrypoint进程,让原entrypoint启动的常驻服务(比如PHP-FPM)成为PID 1,维持容器运行。
修改后的configure_memory.sh示例:
#!/bin/sh set -e # 计算可用内存(单位MB) AVAILABLE_MEM=$(free -m | awk '/Mem:/ {print $2}') # 动态设置memory_limit if [ "$AVAILABLE_MEM" -ge 16384 ]; then echo "memory_limit = 512M" > /usr/local/etc/php/conf.d/memory-limit.ini else echo "memory_limit = 256M" > /usr/local/etc/php/conf.d/memory-limit.ini fi # 可选:动态配置PHP-FPM的max_*children参数 FPM_CONF="/usr/local/etc/php-fpm.d/www.conf" if [ "$AVAILABLE_MEM" -ge 16384 ]; then sed -i 's/pm.max_children = .*/pm.max_children = 32/' "$FPM_CONF" sed -i 's/pm.start_servers = .*/pm.start_servers = 8/' "$FPM_CONF" else sed -i 's/pm.max_children = .*/pm.max_children = 16/' "$FPM_CONF" sed -i 's/pm.start_servers = .*/pm.start_servers = 4/' "$FPM_CONF" fi # 替换当前进程执行原entrypoint及后续CMD参数 exec "$@"
Dockerfile中ENTRYPOINT的配置要确保将原entrypoint作为参数传入:
FROM pimcore/pimcore:php8.2-latest # 复制项目文件、配置等步骤... COPY configure_memory.sh /usr/local/bin/ RUN chmod +x /usr/local/bin/configure_memory.sh # 自定义entrypoint + 原entrypoint作为参数 ENTRYPOINT ["configure_memory.sh", "docker-php-entrypoint"] # 保持原镜像的CMD CMD ["php-fpm"]
更优的配置方式
1. 环境变量直接传参(适合固定环境部署)
如果你的两个服务环境是固定的(16GB/3.5GB),可以不用脚本,直接在启动容器时通过环境变量覆盖PHP配置:
- 16GB环境启动:
docker run -e PHP_MEMORY_LIMIT=512M -e PHP_FPM_MAX_CHILDREN=32 your-image - 3.5GB环境启动:
docker run -e PHP_MEMORY_LIMIT=256M -e PHP_FPM_MAX_CHILDREN=16 your-image
注:部分PHP官方镜像支持PHP_MEMORY_LIMIT这类环境变量自动写入php.ini,若基础镜像不支持,可在Dockerfile中添加一个简单的脚本读取环境变量生成配置文件。
2. 结合cgroup内存限制动态配置
如果容器是通过--memory参数限制内存的,可以直接读取cgroup的内存限制值来计算,比free命令更准确(因为free读取的是宿主机内存,而容器可能被限制了内存配额):
# 读取cgroup内存限制(单位字节) CGROUP_MEM_LIMIT=$(cat /sys/fs/cgroup/memory/memory.limit_in_bytes) # 转换为MB AVAILABLE_MEM=$((CGROUP_MEM_LIMIT / 1024 / 1024))
这种方式更适合容器有明确内存限制的场景,避免宿主机内存干扰。
内容的提问来源于stack exchange,提问作者ZunX
相关产品推荐
相关产品推荐

