CaiWuXiTong/deploy/Dockerfile
WuYongJie 3fd41dfb69 修复 operations_replica 生产驱动崩溃 (#9)
## 任务占用与边界

- 任务名称:修复 operations_replica 生产驱动崩溃
- 实际开发者:WuYongJie
- 任务来源/团队分工:生产快照恢复
- 目标结果:生产 Linux 容器不再通过会崩溃的 PDO_ODBC 访问 FreeTDS;保留固定只读查询、共享系统数据库凭据来源和私有隧道。
- 预计修改路径:deploy/Dockerfile;modules/EcommerceFinance/Services/UpstreamOdbcConnection.php;tests/Unit/EcommerceFinance/UpstreamOdbcConnectionTest.php
- 预计页面或路由:公司、店铺、商标信息页的共享快照读取
- 预计 Controller / Repository:UpstreamOdbcConnection;UpstreamReadOnlyQuery
- 数据源、表/视图和字段:operations_replica 固定只读查询;不新增上游写入、全表同步或业务字段。
- 上游 source_key / scope:operations_replica;company-information.read、store-information.read、trademark-information.read
- 权限名、菜单键或共享组件:不变
- 明确不修改的范围:上游账号、密码、权限、表结构、业务数据、Windows/本地 ODBC 行为

## 开工碰撞检查

- [x] Codex 已执行 scripts/codex-task-preflight.ps1
- [x] 已检查最新 main 和所有远程任务分支
- [x] 已搜索主线既有页面、接口、Repository 和数据查询
- [x] 未发现重叠

## 实际改动

- 完成内容:开发中
- Codex 实际修改的文件:待补充
- 新增或变更的公共契约:仅 Linux 容器内的 FreeTDS PDO 传输选择;不新增外部配置项
- 与原计划的差异:无

## 验证证据

- 正常流程:同一共享配置和私有隧道下,FreeTDS 命令行 SELECT 1 已成功;PDO_ODBC 独立进程退出码 139。
- 空数据/错误输入/无权限场景:待补充自动测试。
- 受影响旧功能:Windows/本地仍使用既有 ODBC。
- 自动测试及结果:待补充。
- 实际页面、接口或只读业务查询结果:待合并和获准发布后生成三份首份快照。

## 风险检查

- [ ] 不涉及金额、权限、审批、数据库迁移、生产配置或数据修复
- [x] 如涉及上述高风险内容,已在下方写明影响、回滚和所需授权
- [x] 未提交 .env、密码、Token、私钥、真实财务数据、生产日志或构建产物
- [x] 前端改动符合 DESIGN.md;无前端改动则写“不适用”

高风险影响、回滚和授权状态:需要构建新的应用镜像并经生产最小只读查询验证;不迁移、不改上游数据。若验证失败,发布脚本自动保留上一个可回滚镜像。

## 合并前复查

- [ ] 已重新拉取远程引用并用实际修改范围再次运行碰撞检查
- [ ] PR 不再是 WIP:,所有测试结果已经补齐
- [ ] Codex 已重新读取原始需求和验收标准,并逐文件审核 origin/main...任务分支 的完整 diff
- [ ] Codex 自审确认无越界修改、重复实现、敏感内容、未处理冲突和未验证结果
- [ ] 合并顺序不会覆盖其他未合并任务
- [x] 已授权当前任务的 Codex 执行 Squash merge、验证 main 并清理任务分支
- [ ] 如涉及生产迁移、数据修复、删除、覆盖配置或部署,已另行取得对应高风险授权

Reviewed-on: http://git.1080p.hk/WuYongJie/CaiWuXiTong/pulls/9
2026-08-04 17:09:14 +08:00

99 lines
2.8 KiB
Docker

# syntax=docker/dockerfile:1.7
FROM php:8.3-apache-bookworm AS php-base
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
curl \
libcurl4-openssl-dev \
libfreetype6-dev \
libicu-dev \
libjpeg62-turbo-dev \
libonig-dev \
libpng-dev \
libxml2-dev \
libzip-dev \
freetds-bin \
freetds-dev \
tdsodbc \
unixodbc-dev \
unzip \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-configure pdo_odbc --with-pdo-odbc=unixODBC,/usr \
&& docker-php-ext-install -j2 \
bcmath \
curl \
dom \
exif \
gd \
intl \
mbstring \
pdo_dblib \
pdo_odbc \
pdo_mysql \
simplexml \
xml \
zip \
&& a2enmod expires headers rewrite \
&& rm -rf /var/lib/apt/lists/*
FROM php-base AS vendor
COPY --from=composer:2.8 /usr/bin/composer /usr/local/bin/composer
WORKDIR /build
COPY composer.json composer.lock ./
RUN --mount=type=cache,target=/tmp/composer-cache \
COMPOSER_CACHE_DIR=/tmp/composer-cache composer install \
--prefer-dist \
--no-dev \
--no-interaction \
--no-progress \
--no-scripts \
--optimize-autoloader
FROM php-base AS runtime
ARG VCS_REF=unknown
ARG BUILD_DATE=unknown
LABEL com.caiwu.project="CaiWuXiTong" \
org.opencontainers.image.revision="$VCS_REF" \
org.opencontainers.image.created="$BUILD_DATE"
WORKDIR /var/www/html
COPY --from=vendor /build/vendor /var/www/html/vendor
COPY --from=frontend /js /var/www/html/public/js
COPY --from=frontend /css/app.css /var/www/html/public/css/app.css
COPY --from=frontend /mix-manifest.json /var/www/html/public/mix-manifest.json
COPY deploy/apache-vhost.conf /etc/apache2/sites-available/000-default.conf
COPY deploy/freetds.conf /etc/freetds/freetds.conf
COPY deploy/php.ini /usr/local/etc/php/conf.d/caiwu.ini
COPY deploy/entrypoint.sh /usr/local/bin/caiwu-entrypoint
COPY . /var/www/html
COPY --from=frontend /vendor /var/www/html/public/vendor
RUN test -f public/js/auth/common.min.js \
&& test -f public/css/app.css \
&& test -f public/mix-manifest.json \
&& test -f public/vendor/apexcharts/apexcharts.min.js \
&& test -f public/vendor/js-cookie/js.cookie.js \
&& test -f public/vendor/quicksand/css/quicksand.css \
&& chmod +x /usr/local/bin/caiwu-entrypoint \
&& mkdir -p \
storage/app/public \
storage/app/temp \
storage/app/uploads \
storage/framework/cache/data \
storage/framework/sessions \
storage/framework/views \
storage/logs \
bootstrap/cache \
&& chown -R www-data:www-data storage bootstrap/cache
ENTRYPOINT ["caiwu-entrypoint"]
CMD ["apache2-foreground"]