chore(docker): docker 及环境变量更新

This commit is contained in:
2025-12-24 10:39:14 +08:00
parent e2d6a02860
commit 224c2a3117
27 changed files with 11831 additions and 134 deletions

2
.env
View File

@@ -7,8 +7,6 @@ APP_ENV=development
# PHP/PHP-FPM 配置 # PHP/PHP-FPM 配置
PHP_VERSION=7.4 PHP_VERSION=7.4
PHP_FPM_VERSION=7.4-fpm PHP_FPM_VERSION=7.4-fpm
PHP_FPM_PORT=9100
XDEBUG_POST=9103
# 数据库配置 # 数据库配置
MYSQL_ROOT_HOST=% MYSQL_ROOT_HOST=%

25
.env.development Normal file
View File

@@ -0,0 +1,25 @@
# 项目配置, 请根据实际情况修改
PROJECT_NAME=newshop
# ThinkPHP 6.x 配置, 请根据实际情况修改
APP_ENV=development
# PHP/PHP-FPM 配置
PHP_VERSION=7.4
PHP_FPM_VERSION=7.4-fpm
# 数据库配置
MYSQL_ROOT_HOST=%
MYSQL_DATABASE=shop_mallnew
MYSQL_USER=shop_mallnew
MYSQL_PASSWORD=shop_mallnew
MYSQL_PORT=3326
# Redis 绑定端口及密码
REDIS_PASSWORD=luckyshop123!@#
REDIS_PORT=6499
# Nginx 暴漏端口
NGINX_PORT=8050
NGINX_SSL_PORT=8052

View File

@@ -1,24 +1,24 @@
# 项目配置, 请根据实际情况修改 # 项目配置, 请根据实际情况修改
PROJECT_NAME=newshop PROJECT_NAME=newshop
# ThinkPHP 6.x 配置, 请根据实际情况修改
APP_ENV=development
# PHP/PHP-FPM 配置 # PHP/PHP-FPM 配置
PHP_VERSION=7.4 PHP_VERSION=7.4
PHP_FPM_VERSION=7.4-fpm PHP_FPM_VERSION=7.4-fpm
PHP_FPM_PORT=9000
XDEBUG_POST=9003
# 数据库配置 # 数据库配置
MYSQL_ROOT_HOST=% MYSQL_ROOT_HOST=%
MYSQL_DATABASE=shop_mallnew MYSQL_DATABASE=shop_mallnew
MYSQL_USER=shop_mallnew MYSQL_USER=shop_mallnew
MYSQL_PASSWORD=shop_mallnew MYSQL_PASSWORD=shop_mallnew
MYSQL_PORT=3306 MYSQL_PORT=3316
# Redis 配置 # Redis 配置
REDIS_PASSWORD=luckyshop123!@# REDIS_PASSWORD=luckyshop123!@#
REDIS_PORT=6379 REDIS_PORT=6399
# Nginx 配置 # Nginx 配置
NGINX_PORT=80 NGINX_PORT=8010
NGINX_SSL_PORT=443 NGINX_SSL_PORT=8012

25
.env.local Normal file
View File

@@ -0,0 +1,25 @@
# 项目配置, 请根据实际情况修改
PROJECT_NAME=newshop
# ThinkPHP 6.x 配置, 请根据实际情况修改
APP_ENV=local
# PHP/PHP-FPM 配置
PHP_VERSION=7.4
PHP_FPM_VERSION=7.4-fpm
# 数据库配置
MYSQL_ROOT_HOST=%
MYSQL_DATABASE=shop_dev
MYSQL_USER=shop_mallnew
MYSQL_PASSWORD=shop_mallnew
MYSQL_PORT=3316
# Redis 配置
REDIS_PASSWORD=luckyshop123!@#
REDIS_PORT=6399
# Nginx 配置
NGINX_PORT=8010
NGINX_SSL_PORT=8012

3
.gitignore vendored
View File

@@ -18,6 +18,9 @@ __pycache__
.idea .idea
.vscode .vscode
# 环境变量
.env
# 源码结构 # 源码结构
debug.txt debug.txt
.travis.yml .travis.yml

138
README.md Normal file
View File

@@ -0,0 +1,138 @@
# 在线商城PHP项目
## Git 分支策略
| 环境 | 推荐分支 | 备选分支 | 说明 |
|------|----------|----------|------|
| local | `dev` | `develop` | 本地开发环境 |
| development | `dev` | `development` | 开发测试环境 |
| test | `test` | `staging` | 测试环境 |
| staging | `staging` | `pre-release` | 预发布环境 |
| production | `master` | `main` | 生产环境 |
**部署建议**
- 每个环境部署前请先切换到对应的Git分支
- 确保代码版本与目标环境匹配
- 生产环境部署前建议先在staging环境验证
## Docker 部署
```bash
cp .env.example .env.development
```
**注意**
- 在同一目录下面,执行 `docker-compose` 命令时,需要指定项目名称。用来区分不同的环境。如 `shop_local``shop_dev` 等。
- 本地部署时,需要将 `APP_ENV` 设置为 `local`
- 开发环境部署时,需要将 `APP_ENV` 设置为 `development`
## 环境变量
- `APP_ENV`: 应用环境,默认值为 `development`
## 开发环境-local 部署
**对应Git分支**: `main``develop`
```bash
# 切换到本地开发分支
git checkout main # 或 develop
# 本地部署时,需要将 APP_ENV 设置为 local, 并指定 docker-compose.local.yml 文件
docker-compose --env-file .env.local -f docker-compose.local.yml up -d
# docker-compose --project-name shop_local --env-file .env.local -f docker-compose.local.yml up -d
# docker-compose down 命令,用来停止并删除容器
docker-compose -f docker-compose.local.yml down -v
# docker-compose --project-name shop_local down -v
```
## 开发环境-development 部署
**对应Git分支**: `dev``development`
```bash
# 切换到开发分支
git checkout dev # 或 development
# 默认使用 docker-compose.yml 文件
docker-compose --project-name shop_development --env-file .env.development up -d
# docker-compose down 命令,用来停止并删除容器
docker-compose --project-name shop_development down -v
```
## 开发环境-test 部署 (测试环境)
**对应Git分支**: `test``staging`
```bash
# 切换到测试分支
git checkout test # 或 staging
# 默认使用 docker-compose.yml 文件
docker-compose --project-name shop_test --env-file .env.test up -d
# docker-compose down 命令,用来停止并删除容器
docker-compose --project-name shop_test down -v
```
## 开发环境-staging 部署(预发布环境)
**对应Git分支**: `staging``pre-release`
```bash
# 切换到预发布分支
git checkout staging # 或 pre-release
# 默认使用 docker-compose.yml 文件
docker-compose --project-name shop_staging --env-file .env.staging up -d
# docker-compose down 命令,用来停止并删除容器
docker-compose --project-name shop_staging down -v
```
## 生产环境-production 部署
**对应Git分支**: `master``main``production`
```bash
# 切换到生产分支
git checkout main
# 确保代码是最新的生产版本
git pull origin main
# 默认使用 docker-compose.yml 文件
docker-compose --project-name shop_production --env-file .env.production up -d
# docker-compose down 命令,用来停止并删除容器
docker-compose --project-name shop_production down -v
```
## 便捷部署脚本
### 环境切换与部署脚本
- `deploy.sh` 脚本:
### 使用方法
```bash
# 赋予执行权限
chmod +x deploy.sh
# 部署到开发环境
./deploy.sh development
# 部署到测试环境
./deploy.sh test
# 部署到生产环境
./deploy.sh production
```

100
deploy.sh Normal file
View File

@@ -0,0 +1,100 @@
#!/bin/bash
# deploy.sh - 环境切换与部署脚本
# 使用方法: ./deploy.sh <environment>
# 示例: ./deploy.sh development
ENVIRONMENT=$1
PROJECT_NAME="shop_${ENVIRONMENT}"
BRANCH=""
COMPOSE_FILE="docker-compose.yml"
ENV_FILE=".env.${ENVIRONMENT}"
# 现实运行中的服务器网站,数据库备份目录
RUN_SERVER_WEB_ROOT="/data/wwwroot/shop-projects"
RUN_SERVER_DB_BACKUP_DIR="/data/backup/shop-projects"
case $ENVIRONMENT in
"local")
BRANCH="dev"
COMPOSE_FILE="docker-compose.local.yml"
ENV_FILE=".env.local"
;;
"development")
BRANCH="dev"
;;
"test")
BRANCH="test"
;;
"staging")
BRANCH="staging"
;;
"production")
BRANCH="main"
;;
*)
echo "错误: 不支持的环境 '$ENVIRONMENT'"
echo "支持的环境: local, development, test, staging, production"
exit 1
;;
esac
echo "=========================================="
echo "部署环境: $ENVIRONMENT"
echo "项目名称: $PROJECT_NAME"
echo "Git分支: $BRANCH"
echo "配置文件: $COMPOSE_FILE"
echo "环境文件: $ENV_FILE"
echo "=========================================="
# 切换分支
echo "切换到Git分支: $BRANCH"
git checkout $BRANCH
if [ $? -ne 0 ]; then
echo "错误: 无法切换到分支 $BRANCH"
exit 1
fi
# 拉取最新代码
echo "拉取最新代码..."
git pull origin $BRANCH
# 根据不同的环境,执行不同的操作
# 预发布环境、生产环境都需要使用运行服务上的用户文件,将用户文件复制到指定目录
# 根据不同的环境,执行不同的操作
# 预发布环境、生产环境都需要还原数据库,使用数据库备份文件,并尝试使用数据库升级
if [ "$ENVIRONMENT" = "local" ]; then
echo "本地环境,跳过数据库还原"
else
echo "还原数据库..."
# 还原数据库
docker-compose --project-name $PROJECT_NAME exec -T db bash -c "mysql -uroot -p$DB_ROOT_PASSWORD shop < $DB_BACKUP_DIR/shop.sql"
if [ $? -ne 0 ]; then
echo "错误: 数据库还原失败"
exit 1
fi
# 尝试使用数据库升级脚本
echo "尝试使用数据库升级..."
docker-compose --project-name $PROJECT_NAME exec -T db bash -c "php artisan migrate --force"
if [ $? -ne 0 ]; then
echo "数据库升级失败"
else
echo "数据库升级成功"
fi
fi
# 构建并启动容器
echo "构建并启动Docker容器..."
if [ "$ENVIRONMENT" = "local" ]; then
docker-compose --env-file $ENV_FILE -f $COMPOSE_FILE up -d
else
docker-compose --project-name $PROJECT_NAME --env-file $ENV_FILE up -d
fi
echo "部署完成!"
echo "查看容器状态: docker-compose --project-name $PROJECT_NAME ps"
echo "查看日志: docker-compose --project-name $PROJECT_NAME logs -f"

118
docker-compose.local.yml Normal file
View File

@@ -0,0 +1,118 @@
# 特别说明本地local环境方便操作所以未使用的统一的docker-compose.yml文件只保留了local环境的配置
x-shared-env: &shared-api-env
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-rootpassword}
MYSQL_ROOT_HOST: ${MYSQL_ROOT_HOST:-'%'} # 允许root从任何主机连接
MYSQL_DATABASE: ${MYSQL_DATABASE:-shop_mallnew}
MYSQL_USER: ${MYSQL_USER:-shop_mallnew}
MYSQL_PASSWORD: ${MYSQL_PASSWORD:-shop_mallnew}
REDIS_PASSWORD: ${REDIS_PASSWORD:-luckyshop123!@#}
REDIS_PORT: ${REDIS_PORT:-6379}
# 将服务归类到目录 A 中
services:
php-fpm:
build:
context: ./docker/php
dockerfile: Dockerfile
container_name: ${PROJECT_NAME}_php
restart: always
extra_hosts:
- "host.docker.internal:host-gateway" # 支持主机名解析
environment:
PHP_ENV: ${PHP_ENV:-development}
# 环境变量, APP_ENV 应用于 ThinkPHP 6.x 框架, .env.local 要想启用,需要在项目根目录下创建 .env.local 文件,并将 APP_ENV 设置为 local
# 同理,如果要启用开发环境,则将 APP_ENV 设置为 development如果要启用生产环境则将 APP_ENV 设置为 production
# 不然ThinkPHP 6.x 系列,会只加载 .env 文件,而不会加载 .env.local 文件,导致 .env.local 文件中的配置不会生效
APP_ENV: ${APP_ENV:-local}
APP_DEBUG: ${APP_DEBUG:-true}
volumes:
- ./:/var/www/all_source
- ./src:/var/www/html
# 更新下载源列表以加速apt-get
- ./docker/debian/sources.list:/etc/apt/sources.list:ro
- ./docker/php/php.ini:/usr/local/etc/php/php.ini:ro
depends_on:
- db
healthcheck:
test: ["CMD", "bash", "-c", "curl -f http://localhost:9000/status"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
networks:
- sass-platform-net
labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
nginx:
build:
context: ./docker/nginx
dockerfile: Dockerfile
container_name: ${PROJECT_NAME}_nginx
restart: always
ports:
- "${NGINX_PORT:-80}:80"
- "${NGINX_SSL_PORT:-443}:443"
volumes:
# 挂载项目代码到 Nginx 容器中
- ./src:/var/www/html:rw
# 更新下载源列表以加速apt-get
- ./docker/debian/sources.list:/etc/apt/sources.list:ro
# 创建临时目录
- /var/www/server/nginx/proxy_temp_dir
- /var/www/server/nginx/proxy_cache_dir
depends_on:
- php-fpm
networks:
- sass-platform-net
labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
db:
image: mysql:5.7.44
container_name: ${PROJECT_NAME}_mysql
environment:
<<: *shared-api-env
volumes:
- mysql_db_data:/var/lib/mysql
- ./docker/mysql/init:/docker-entrypoint-initdb.d
- ./docker/mysql/my.cnf:/etc/mysql/conf.d/custom.cnf
ports:
- ${MYSQL_PORT:-3306}:3306
networks:
- sass-platform-net
restart: unless-stopped
command:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
- --innodb_buffer_pool_size=256M
labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
# Redis 服务(可选)
redis:
image: redis:8.2
container_name: ${PROJECT_NAME}_redis
environment:
REDIS_PASSWORD: ${REDIS_PASSWORD:-luckyshop123!@#}
REDISCLI_AUTH: ${REDIS_PASSWORD:-luckyshop123!@#}
ports:
- "${REDIS_PORT:-6379}:6379"
volumes:
- redis_data:/data
- ./docker/redis/redis.conf:/etc/redis/redis.conf
networks:
- sass-platform-net
restart: unless-stopped
labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}"
volumes:
mysql_db_data:
redis_data:
networks:
sass-platform-net:
driver: bridge

View File

@@ -14,7 +14,7 @@ services:
build: build:
context: ./docker/php context: ./docker/php
dockerfile: Dockerfile dockerfile: Dockerfile
container_name: ${PROJECT_NAME}_php container_name: ${PROJECT_NAME}_${APP_ENV}_php
restart: always restart: always
extra_hosts: extra_hosts:
- "host.docker.internal:host-gateway" # 支持主机名解析 - "host.docker.internal:host-gateway" # 支持主机名解析
@@ -25,23 +25,16 @@ services:
# 不然ThinkPHP 6.x 系列,会只加载 .env 文件,而不会加载 .env.local 文件,导致 .env.local 文件中的配置不会生效 # 不然ThinkPHP 6.x 系列,会只加载 .env 文件,而不会加载 .env.local 文件,导致 .env.local 文件中的配置不会生效
APP_ENV: ${APP_ENV:-development} APP_ENV: ${APP_ENV:-development}
APP_DEBUG: ${APP_DEBUG:-true} APP_DEBUG: ${APP_DEBUG:-true}
XDEBUG_CONFIG: ${XDEBUG_CONFIG:-client_host=host.docker.internal client_port=9003}
PHP_IDE_CONFIG: serverName=docker-php
ports:
- "${PHP_FPM_PORT:-9000}:9000" # PHP-FPM
- "${XDEBUG_POST:-9003}:9003" # Xdebug
volumes: volumes:
- ./:/var/www/all_source - ./:/var/www/all_source
- ./src:/var/www/html - ./src:/var/www/html
# 更新下载源列表以加速apt-get # 更新下载源列表以加速apt-get
- ./docker/debian/sources.list:/etc/apt/sources.list:ro - ./docker/debian/sources.list:/etc/apt/sources.list:ro
- ./docker/php/php.ini:/usr/local/etc/php/php.ini:ro - ./docker/php/php.ini:/usr/local/etc/php/php.ini:ro
- ./docker/php/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini
- xdebug_logs:/tmp # Xdebug 日志目录
depends_on: depends_on:
- db - db
healthcheck: healthcheck:
test: ["CMD", "bash", "-c", "curl -f http://localhost:9000/status && ps aux | grep '[p]hp think cron:schedule'"] test: ["CMD", "bash", "-c", "curl -f http://localhost:9000/status"]
interval: 30s interval: 30s
timeout: 10s timeout: 10s
retries: 3 retries: 3
@@ -49,18 +42,19 @@ services:
networks: networks:
- sass-platform-net - sass-platform-net
labels: labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}" - "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}"
nginx: nginx:
build: build:
context: ./docker/nginx context: ./docker/nginx
dockerfile: Dockerfile dockerfile: Dockerfile
container_name: ${PROJECT_NAME}_nginx container_name: ${PROJECT_NAME}_${APP_ENV}_nginx
restart: always restart: always
ports: ports:
- "${NGINX_PORT:-80}:80" - "${NGINX_PORT:-80}:80"
- "${NGINX_SSL_PORT:-443}:443" - "${NGINX_SSL_PORT:-443}:443"
volumes: volumes:
# 挂载项目代码到 Nginx 容器中
- ./src:/var/www/html:rw - ./src:/var/www/html:rw
# 更新下载源列表以加速apt-get # 更新下载源列表以加速apt-get
- ./docker/debian/sources.list:/etc/apt/sources.list:ro - ./docker/debian/sources.list:/etc/apt/sources.list:ro
@@ -72,11 +66,11 @@ services:
networks: networks:
- sass-platform-net - sass-platform-net
labels: labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}" - "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}"
db: db:
image: mysql:5.7.44 image: mysql:5.7.44
container_name: ${PROJECT_NAME}_mysql container_name: ${PROJECT_NAME}_${APP_ENV}_mysql
environment: environment:
<<: *shared-api-env <<: *shared-api-env
volumes: volumes:
@@ -93,12 +87,12 @@ services:
- --collation-server=utf8mb4_unicode_ci - --collation-server=utf8mb4_unicode_ci
- --innodb_buffer_pool_size=256M - --innodb_buffer_pool_size=256M
labels: labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}" - "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}"
# Redis 服务(可选) # Redis 服务(可选)
redis: redis:
image: redis:8.2 image: redis:8.2
container_name: ${PROJECT_NAME}_redis container_name: ${PROJECT_NAME}_${APP_ENV}_redis
environment: environment:
REDIS_PASSWORD: ${REDIS_PASSWORD:-luckyshop123!@#} REDIS_PASSWORD: ${REDIS_PASSWORD:-luckyshop123!@#}
REDISCLI_AUTH: ${REDIS_PASSWORD:-luckyshop123!@#} REDISCLI_AUTH: ${REDIS_PASSWORD:-luckyshop123!@#}
@@ -111,13 +105,26 @@ services:
- sass-platform-net - sass-platform-net
restart: unless-stopped restart: unless-stopped
labels: labels:
- "com.docker.compose.project.working_dir=${PROJECT_NAME}" - "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}"
volumes: volumes:
mysql_db_data: mysql_db_data:
name: ${PROJECT_NAME}_${APP_ENV}_mysql_db_data
driver: local
driver_opts:
type: none
o: bind
device: ./docker/mysql_db_data/${APP_ENV}
redis_data: redis_data:
xdebug_logs: name: ${PROJECT_NAME}_${APP_ENV}_redis_data
driver: local
driver_opts:
type: none
o: bind
device: ./docker/redis_data/${APP_ENV}
networks: networks:
sass-platform-net: sass-platform-net:
name: ${PROJECT_NAME}_${APP_ENV}_net
driver: bridge driver: bridge

File diff suppressed because one or more lines are too long

View File

@@ -2,6 +2,8 @@
# 字符集设置 # 字符集设置
character-set-server=utf8mb4 character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci collation-server=utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
# 连接设置 # 连接设置
max_connections=100 max_connections=100
@@ -22,6 +24,3 @@ sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
[client] [client]
default-character-set=utf8mb4 default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4

10
docker/mysql_db_data/.gitignore vendored Normal file
View File

@@ -0,0 +1,10 @@
# 忽略目录下所有文件和子目录
*
# 忽略所有子目录
*/
# 但不忽略 .gitkeep 文件
!.gitkeep
# 不忽略 .gitignore 文件自身
!.gitignore
# 不忽略 development/.gitkeep 文件
!development/.gitkeep

View File

View File

@@ -0,0 +1,14 @@
location /ws {
proxy_pass http://php-fpm:8080; # 注意:这里用的是 Docker 服务名或容器名
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 可选设置超时WebSocket 是长连接)
proxy_read_timeout 86400s;
proxy_send_timeout 86400s;
}

View File

@@ -20,6 +20,9 @@
# add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# --- SSL configuration end --- # --- SSL configuration end ---
# 启用 WebSocket 支持
include conf.c/enable-websocket.conf;
#PHP-INFO-START PHP引用配置可以注释或修改 #PHP-INFO-START PHP引用配置可以注释或修改
include conf.c/enable-php-74.conf; include conf.c/enable-php-74.conf;
#PHP-INFO-END #PHP-INFO-END

View File

@@ -1,10 +0,0 @@
# 使用官方PHP镜像
FROM php:7.4.33-fpm-dev-newshop
# 设置工作目录
WORKDIR /var/www/html
# 暴露端口
EXPOSE 9000 9003
CMD ["php-fpm"]

View File

@@ -27,8 +27,14 @@ RUN apt-get update && apt-get install -y \
libfreetype6-dev \ libfreetype6-dev \
libjpeg62-turbo-dev \ libjpeg62-turbo-dev \
libpng-dev \ libpng-dev \
iputils-ping \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
# 安装 WebSocat 完成后,清理缓存
COPY ./websocat /usr/local/bin/websocat
RUN chmod +x /usr/local/bin/websocat
# 安装 PHP 扩展 # 安装 PHP 扩展
RUN docker-php-ext-configure gd --with-freetype --with-jpeg \ RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install \ && docker-php-ext-install \
@@ -45,9 +51,6 @@ RUN docker-php-ext-configure gd --with-freetype --with-jpeg \
# 安装 Redis 扩展 # 安装 Redis 扩展
RUN pecl install redis-5.3.7 && docker-php-ext-enable redis RUN pecl install redis-5.3.7 && docker-php-ext-enable redis
# 安装 Xdebug兼容 PHP 7.4 的版本)
RUN pecl install xdebug-3.1.6 && docker-php-ext-enable xdebug
# 安装Composer # 安装Composer
COPY --from=composer:2.2.25 /usr/bin/composer /usr/bin/composer COPY --from=composer:2.2.25 /usr/bin/composer /usr/bin/composer
@@ -56,30 +59,15 @@ RUN composer --version
# 修改 PHP 配置 # 修改 PHP 配置
RUN echo "memory_limit=256M" > /usr/local/etc/php/conf.d/memory-limit.ini \ RUN echo "memory_limit=256M" > /usr/local/etc/php/conf.d/memory-limit.ini \
&& echo "upload_max_filesize=50M" >> /usr/local/etc/php/conf.d/uploads.ini \ && echo "upload_max_filesize=150M" >> /usr/local/etc/php/conf.d/uploads.ini \
&& echo "post_max_size=50M" >> /usr/local/etc/php/conf.d/uploads.ini && echo "post_max_size=150M" >> /usr/local/etc/php/conf.d/uploads.ini
# 创建 Xdebug 配置
RUN echo "zend_extension=xdebug.so" > /usr/local/etc/php/conf.d/xdebug.ini
# # 使用Composer安装项目依赖可选根据需要启用, 更多的时候,会出错,要在容器中执行操作) # # 使用Composer安装项目依赖可选根据需要启用, 更多的时候,会出错,要在容器中执行操作)
# RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ # RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/
# RUN composer install --no-dev --optimize-autoloader --working-dir=/var/www/html # RUN composer install --no-dev --optimize-autoloader --working-dir=/var/www/html
# # 创建非 root 用户 # 暴露端口9000 为 PHP-FPM 端口8080 为 WebSocket 端口
# RUN useradd -m -u 1000 phpuser && chown -R phpuser:phpuser /var/www/html EXPOSE 9000 8080
# 设置权限, 防止以下目录无法写入的问题
RUN chmod -R a+rw /var/www/html/runtime
RUN chmod -R a+rw /var/www/html/uploads
RUN chmod -R a+rw /var/www/html/tmp
RUN chmod -R a+rw /var/www/html/temp
# USER phpuser
# 暴露端口
EXPOSE 9000 9003
############ 查看 cron 进程 ############ 查看 cron 进程
## 查看 cron 进程 ## 查看 cron 进程
@@ -95,4 +83,10 @@ EXPOSE 9000 9003
####################################### #######################################
# 启动Supervisor # 启动Supervisor
# 添加在Dockerfile末尾CMD命令之前
COPY ./entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
# 修改CMD命令
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"] CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/conf.d/supervisord.conf"]

113
docker/php/entrypoint.sh Normal file
View File

@@ -0,0 +1,113 @@
#!/bin/bash
set -e
echo "=== ThinkPHP Docker权限初始化 ==="
# 定义应用根目录
APP_ROOT="/var/www/html"
# 获取正确的用户和组
if [ -n "$USER_ID" ] && [ -n "$GROUP_ID" ]; then
# 如果指定了用户ID修改www-data
usermod -u $USER_ID www-data
groupmod -g $GROUP_ID www-data
fi
echo "当前用户: $(whoami)"
echo "UID: $(id -u), GID: $(id -g)"
# 修复目录所有权和权限
fix_directory_permissions() {
local dir=$1
echo "修复PHP目录权限: $dir"
# 确保目录存在
mkdir -p "$dir"
# 设置所有权
chown -R www-data:www-data "$dir"
# 设置权限
chmod -R 775 "$dir"
# 设置setgid权限
chmod g+s "$dir"
# 尝试设置ACL如果支持
if command -v setfacl >/dev/null 2>&1; then
setfacl -dR -m u:www-data:rwx "$dir"
fi
find "$dir" -type d -exec chmod 775 {} \;
find "$dir" -type f -exec chmod 775 {} \;
find "$dir" -type d -exec chmod g+s {} \;
find "$dir" -type f -exec chmod g+s {} \;
# 设置umask
umask 0002
echo "$dir 权限设置完成, 目录权限: $(stat -c '%a %n' "$dir"), setgid权限: $(stat -c '%a %n' "$dir" | grep 's')"
}
# 处理所有需要权限的目录
directories=("runtime" "upload" "runtime/log" "runtime/cache" "runtime/temp")
for dir in "${directories[@]}"; do
fix_directory_permissions "$APP_ROOT/$dir"
done
# 验证权限
echo "=== 权限验证 ==="
echo "当前用户: $(whoami)"
echo "当前UID: $(id -u), GID: $(id -g)"
echo "当前umask: $(umask)"
# 验证www-data用户是否可以在runtime和upload目录下新建子目录
# 方法1使用sudo
if command -v sudo >/dev/null 2>&1; then
echo "使用sudo测试..."
if sudo -u www-data mkdir -p $APP_ROOT/runtime/log/test_dir 2>/dev/null; then
echo "✅ sudo: runtime目录创建子目录成功 [使用www-data用户]"
rm -rf $APP_ROOT/runtime/log/test_dir
else
echo "❌ sudo: runtime目录创建子目录失败 [使用www-data用户]"
fi
fi
# 方法2使用su
echo "使用su测试..."
if su -s /bin/sh -c "mkdir -p $APP_ROOT/runtime/log/test_dir" www-data 2>/dev/null; then
echo "✅ su: runtime目录创建子目录成功 [使用www-data用户]"
rm -rf $APP_ROOT/runtime/log/test_dir
else
echo "❌ su: runtime目录创建子目录失败 [使用www-data用户]"
fi
# 方法3使用runuser
if command -v runuser >/dev/null 2>&1; then
echo "使用runuser测试..."
if runuser -u www-data -- mkdir -p $APP_ROOT/runtime/log/test_dir 2>/dev/null; then
echo "✅ runuser: runtime目录创建子目录成功 [使用www-data用户]"
rm -rf $APP_ROOT/runtime/log/test_dir
else
echo "❌ runuser: runtime目录创建子目录失败 [使用www-data用户]"
fi
fi
# 检查www-data用户和组
echo "检查www-data用户..."
id www-data
groups www-data
# 检查目录的实际权限
echo "检查目录权限..."
ls -ld $APP_ROOT/runtime/log
ls -ld $APP_ROOT/runtime/cache
ls -ld $APP_ROOT/runtime/temp
ls -ld $APP_ROOT/upload
echo "=== 启动应用 ==="
# 执行原有的启动命令
exec "$@"

View File

@@ -6,25 +6,57 @@ logfile_backups=10
loglevel=info loglevel=info
pidfile=/var/run/supervisord.pid pidfile=/var/run/supervisord.pid
[program:php-permission-change]
command=/bin/bash -c "sleep 15 && /usr/local/bin/entrypoint.sh"
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
stdout_logfile=/var/log/supervisor/php-permission-change.log
stderr_logfile=/var/log/supervisor/php-permission-change-error.log
[program:php-fpm] [program:php-fpm]
command=php-fpm command=php-fpm
autostart=true autostart=true
autorestart=true autorestart=true
startretries=3 startretries=3
startsecs=1 startsecs=1
stdout_logfile=/dev/stdout stopasgroup=true
stdout_logfile_maxbytes=0 killasgroup=true
stderr_logfile=/dev/stderr stdout_logfile=/var/log/supervisor/php-fpm.log
stderr_logfile_maxbytes=0 stdout_logfile_maxbytes=10MB
stdout_logfile_backups=10
stderr_logfile=/var/log/supervisor/php-fpm-error.log
stderr_logfile_maxbytes=10MB
stderr_logfile_backups=10
[program:think-cron] [program:think-cron]
command=php /var/www/html/think cron:schedule command=php /var/www/html/think cron:schedule
environment=APP_ENV=local process_name=%(program_name)s_%(process_num)02d
numprocs=1
autostart=true autostart=true
autorestart=true autorestart=true
startretries=5 startretries=3
startsecs=2 stdout_logfile=/var/log/supervisor/think-cron.log
stdout_logfile=/dev/stdout stdout_logfile_maxbytes=10MB
stdout_logfile_maxbytes=0 stdout_logfile_backups=10
stderr_logfile=/dev/stderr stderr_logfile=/var/log/supervisor/think-cron-error.log
stderr_logfile_maxbytes=0 stderr_logfile_maxbytes=10MB
stderr_logfile_backups=10
startsecs=3
stopwaitsecs=10
[program:websocket-server]
command=php ./ws_server.php
workdir=/var/www/html
autostart=true
autorestart=true
startretries=3
stdout_logfile=/var/log/supervisor/websocket-server.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=10
stderr_logfile=/var/log/supervisor/websocket-server-error.log
stderr_logfile_maxbytes=10MB
stderr_logfile_backups=10
startsecs=3
stopwaitsecs=10

BIN
docker/php/websocat Normal file

Binary file not shown.

10
docker/redis_data/.gitignore vendored Normal file
View File

@@ -0,0 +1,10 @@
# 忽略目录下所有文件和子目录
*
# 忽略所有子目录
*/
# 但不忽略 .gitkeep 文件
!.gitkeep
# 不忽略 .gitignore 文件自身
!.gitignore
# 不忽略 development/.gitkeep 文件
!development/.gitkeep

View File

10
docker/xdebug_logs/.gitignore vendored Normal file
View File

@@ -0,0 +1,10 @@
# 忽略目录下所有文件和子目录
*
# 忽略所有子目录
*/
# 但不忽略 .gitkeep 文件
!.gitkeep
# 不忽略 .gitignore 文件自身
!.gitignore
# 不忽略 development/.gitkeep 文件
!development/.gitkeep

View File

View File

@@ -3,23 +3,22 @@ APP_TRACE = true
[APP] [APP]
DEFAULT_TIMEZONE = Asia/Shanghai DEFAULT_TIMEZONE = Asia/Shanghai
ENV_MODE = development
[LANG] [LANG]
default_lang = zh-cn default_lang = zh-cn
[DATABASE] [DATABASE]
TYPE = mysql TYPE = mysql
HOSTNAME = 127.0.0.1 HOSTNAME = db
DATABASE = shop_mallnew_dev DATABASE = shop_mallnew
USERNAME = root USERNAME = shop_mallnew
PASSWORD = root PASSWORD = shop_mallnew
HOSTPORT = 3306 HOSTPORT = 3306
CHARSET = utf8 CHARSET = utf8mb4
DEBUG = true DEBUG = true
[redis] [REDIS]
HOST = 127.0.0.1 HOST = redis
PORT = 6379 PORT = 6379
PASSWORD = '' PASSWORD = 'luckyshop123!@#'
EXPIRY = 604800 EXPIRY = 604800

View File

@@ -1,22 +1,24 @@
APP_DEBUG = true APP_DEBUG = true
APP_TRACE = true APP_TRACE = true
[APP] [APP]
DEFAULT_TIMEZONE = Asia/Shanghai DEFAULT_TIMEZONE = Asia/Shanghai
[LANG] [LANG]
default_lang = zh-cn default_lang = zh-cn
[DATABASE] [DATABASE]
TYPE = mysql TYPE = mysql
HOSTNAME = newshop_mysql HOSTNAME = db
DATABASE = shop_dev DATABASE = shop_dev
USERNAME = shop_mallnew USERNAME = shop_mallnew
PASSWORD = shop_mallnew PASSWORD = shop_mallnew
HOSTPORT = 3306 HOSTPORT = 3306
CHARSET = utf8 CHARSET = utf8mb4
DEBUG = true DEBUG = true
[RRDATABASE]
HOSTNAME = 192.168.2.64 [REDIS]
[redis] HOST = redis
HOST = newshop_redis
PORT = 6379 PORT = 6379
PASSWORD = 'luckyshop123!@#' PASSWORD = 'luckyshop123!@#'
EXPIRY = 604800 EXPIRY = 604800

View File

@@ -10,16 +10,16 @@ default_lang = zh-cn
[DATABASE] [DATABASE]
TYPE = mysql TYPE = mysql
HOSTNAME = production_mysql_host HOSTNAME = db
DATABASE = shop_mallnew_prod DATABASE = shop_mallnew
USERNAME = prod_user USERNAME = shop_mallnew
PASSWORD = prod_password PASSWORD = shop_mallnew
HOSTPORT = 3306 HOSTPORT = 3306
CHARSET = utf8 CHARSET = utf8mb4
DEBUG = false DEBUG = false
[redis] [REDIS]
HOST = production_redis_host HOST = redis
PORT = 6379 PORT = 6379
PASSWORD = production_redis_password PASSWORD = 'luckyshop123!@#'
EXPIRY = 86400 EXPIRY = 604800