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
相关产品推荐
相关产品推荐

