You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose的environment是否仅运行时生效?构建PHP时区的替代方案

无需ARG的PHP时区配置解决方案

方案1:通过系统时区文件自动推导(构建时完成)

利用tzdata包安装后的系统时区软链接,解析出时区标识符并写入PHP配置:

FROM php:8-fpm-alpine as php

RUN apk add --no-cache tzdata; \
    # 从/etc/localtime的软链接目标提取时区名称
    TZ=$(readlink /etc/localtime | sed -e 's/^\/usr\/share\/zoneinfo\///'); \
    echo "date.timezone = $TZ" >> ${PHP_INI_DIR}/conf.d/timezone.ini

构建时需确保系统时区已通过环境变量设置(例如使用docker build --env TZ=Europe/Rome .),Dockerfile会自动解析并配置PHP时区。

方案2:启动脚本动态配置(运行时自动同步)

将时区配置逻辑放入启动脚本,容器启动时自动根据TZ环境变量生成配置,无需构建时传递变量:

1. 创建启动脚本 entrypoint.sh

#!/bin/sh
# 生成PHP时区配置
echo "date.timezone = $TZ" > ${PHP_INI_DIR}/conf.d/timezone.ini
# 执行原启动命令
exec "$@"

2. 修改Dockerfile

FROM php:8-fpm-alpine as php

RUN apk add --no-cache tzdata; \
    mkdir -p /usr/local/bin; \
    chmod +x /usr/local/bin/entrypoint.sh

COPY entrypoint.sh /usr/local/bin/
ENTRYPOINT ["entrypoint.sh"]
CMD ["php-fpm"]

3. 保持docker-compose.yml配置不变

version: "3.8"

services:
  php:
    build:
      context: ./
      target: php
    environment:
      TZ: ${TZ:-Europe/Rome}

每次容器启动时,脚本会自动同步TZ变量到PHP配置,确保时区始终正确。

方案3:固定时区(适合无需动态调整场景)

如果时区无需变更,直接在Dockerfile中写死配置:

FROM php:8-fpm-alpine as php

RUN apk add --no-cache tzdata; \
    echo "date.timezone = Europe/Rome" >> ${PHP_INI_DIR}/conf.d/timezone.ini

内容的提问来源于stack exchange,提问作者gremo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 07:13:19