forked from wang4386/CDT-Monitor
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerfile
More file actions
91 lines (73 loc) · 2.48 KB
/
Dockerfile
File metadata and controls
91 lines (73 loc) · 2.48 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# 第一阶段:构建依赖 (Builder Stage)
# 使用官方 Composer 镜像安装 PHP 依赖,避免将 Composer 及其缓存带入最终镜像
FROM composer:2 AS builder
WORKDIR /app
# 复制依赖定义文件
COPY composer.json composer.lock ./
# 安装依赖 (排除开发依赖,优化自动加载)
RUN composer install --no-dev --optimize-autoloader --ignore-platform-reqs --no-interaction --no-scripts
# 复制其余项目文件
COPY . .
# -----------------------------------------------------------------------------
# 第二阶段:运行环境 (Final Stage)
# 基于 Alpine 的 PHP-FPM 镜像,体积非常小
FROM php:8.2-fpm-alpine
# 设置镜像元数据
LABEL maintainer="CDT-Monitor-Docker"
# 设置环境变量:默认时区
ENV TZ=Asia/Shanghai
# 1. 安装运行时系统依赖 (运行 Nginx, SQLite, Cron 必需)
# 2. 安装构建依赖 (编译 PHP 扩展必需,编译后会删除)
RUN apk add --no-cache \
nginx \
dcron \
sqlite-libs \
libcurl \
libxml2 \
tzdata \
&& apk add --no-cache --virtual .build-deps \
$PHPIZE_DEPS \
curl-dev \
libxml2-dev \
sqlite-dev \
oniguruma-dev \
\
# 3. 安装 PHP 扩展
&& docker-php-ext-install \
curl \
pdo_sqlite \
bcmath \
simplexml \
xml \
mbstring \
opcache \
\
# 4. 配置系统时区 (关键修复)
&& ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
&& echo $TZ > /etc/timezone \
\
# 5. 清理构建依赖和缓存,极大减小镜像体积
&& apk del .build-deps \
&& rm -rf /var/cache/apk/*
# 配置 PHP 推荐设置 (生产环境) 并修正 PHP 时区
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" \
&& sed -i "s/;date.timezone =/date.timezone = Asia\/Shanghai/g" "$PHP_INI_DIR/php.ini"
# 配置工作目录
WORKDIR /var/www/html
# 从 Builder 阶段复制项目文件 (包含 vendor)
COPY --from=builder /app /var/www/html
# 创建数据目录并修正权限
RUN mkdir -p /var/www/html/data && \
chown -R www-data:www-data /var/www/html
# 配置 Nginx
COPY docker/nginx.conf /etc/nginx/http.d/default.conf
# 配置 Cron 任务 (每分钟执行一次 monitor.php)
# 将任务写入 www-data 用户的 crontab
RUN echo "* * * * * /usr/local/bin/php /var/www/html/monitor.php >> /dev/null 2>&1" >> /etc/crontabs/www-data
# 复制并配置启动脚本
COPY docker/entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
# 暴露端口
EXPOSE 80
# 设置容器启动入口
ENTRYPOINT ["/entrypoint.sh"]