From 5f48980d310455b17dde2d0e24c7d705a95b2d6c Mon Sep 17 00:00:00 2001 From: ZF sun <34314687@qq.com> Date: Tue, 2 Dec 2025 15:00:06 +0800 Subject: [PATCH] =?UTF-8?q?chore(docker):=20=E6=A0=B9=E6=8D=AE=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E7=8E=AF=E5=A2=83=E5=8C=BA=E5=88=86docker=E5=AE=B9?= =?UTF-8?q?=E5=99=A8=E5=8F=8A=E7=BD=91=E7=BB=9C=EF=BC=8C=E5=AE=8C=E5=85=A8?= =?UTF-8?q?=E9=9A=94=E7=A6=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 27 +++++++++ .env.local | 27 +++++++++ .gitignore | 2 - README.md | 35 ++++++++++- docker-compose.local.yml | 124 +++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 27 +++++---- src/.env.development | 4 +- src/.env.local | 22 +++++++ src/index.php | 11 ++-- src/think | 10 ++-- 10 files changed, 263 insertions(+), 26 deletions(-) create mode 100644 .env.development create mode 100644 .env.local create mode 100644 docker-compose.local.yml create mode 100644 src/.env.local diff --git a/.env.development b/.env.development new file mode 100644 index 000000000..8929627cc --- /dev/null +++ b/.env.development @@ -0,0 +1,27 @@ +# 项目配置, 请根据实际情况修改 +PROJECT_NAME=newshop + +# ThinkPHP 6.x 配置, 请根据实际情况修改 +APP_ENV=development + +# PHP/PHP-FPM 配置 +PHP_VERSION=7.4 +PHP_FPM_VERSION=7.4-fpm +PHP_FPM_PORT=9105 +XDEBUG_POST=9108 + +# 数据库配置 +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 + diff --git a/.env.local b/.env.local new file mode 100644 index 000000000..14ac22153 --- /dev/null +++ b/.env.local @@ -0,0 +1,27 @@ +# 项目配置, 请根据实际情况修改 +PROJECT_NAME=newshop + +# ThinkPHP 6.x 配置, 请根据实际情况修改 +APP_ENV=local + +# PHP/PHP-FPM 配置 +PHP_VERSION=7.4 +PHP_FPM_VERSION=7.4-fpm +PHP_FPM_PORT=9100 +XDEBUG_POST=9103 + +# 数据库配置 +MYSQL_ROOT_HOST=% +MYSQL_DATABASE=shop_mallnew +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 + diff --git a/.gitignore b/.gitignore index 9b0da8b39..ef0dc2766 100644 --- a/.gitignore +++ b/.gitignore @@ -20,8 +20,6 @@ __pycache__ # 环境变量 .env -.env.test -.env.local # 源码结构 debug.txt diff --git a/README.md b/README.md index 156300e9d..23db9ef71 100644 --- a/README.md +++ b/README.md @@ -4,5 +4,38 @@ ## Docker 部署 ```bash -cp .env.example .env +cp .env.example .env.development +``` + +**注意** + +- 在同一目录下面,执行 `docker-compose` 命令时,需要指定项目名称。用来区分不同的环境。如 `shop_local`、`shop_dev` 等。 +- 本地部署时,需要将 `APP_ENV` 设置为 `local`。 +- 开发环境部署时,需要将 `APP_ENV` 设置为 `development`。 + + + +## 环境变量 + +- `APP_ENV`: 应用环境,默认值为 `development`。 + +## 开发环境-local 部署 + +```bash +# 本地部署时,需要将 APP_ENV 设置为 local, 并指定 docker-compose.local.yml 文件 +docker-compose --project-name shop_local --env-file .env.local -f docker-compose.local.yml up -d + +# docker-compose down 命令,用来停止并删除容器 +docker-compose --project-name shop_local down -v +``` + + +## 开发环境-development 部署 + +```bash +# 默认使用 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 ``` \ No newline at end of file diff --git a/docker-compose.local.yml b/docker-compose.local.yml new file mode 100644 index 000000000..234178410 --- /dev/null +++ b/docker-compose.local.yml @@ -0,0 +1,124 @@ +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:-development} + 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: + - ./:/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 + - ./docker/php/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini + - xdebug_logs:/tmp # Xdebug 日志目录 + depends_on: + - db + healthcheck: + test: ["CMD", "bash", "-c", "curl -f http://localhost:9000/status && ps aux | grep '[p]hp think cron:schedule'"] + 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: + xdebug_logs: + +networks: + sass-platform-net: + driver: bridge \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 9244bcca8..c66f65151 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,7 +14,7 @@ services: build: context: ./docker/php dockerfile: Dockerfile - container_name: ${PROJECT_NAME}_php + container_name: ${PROJECT_NAME}_${APP_ENV}_php restart: always extra_hosts: - "host.docker.internal:host-gateway" # 支持主机名解析 @@ -49,13 +49,13 @@ services: networks: - sass-platform-net labels: - - "com.docker.compose.project.working_dir=${PROJECT_NAME}" + - "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}" nginx: build: context: ./docker/nginx dockerfile: Dockerfile - container_name: ${PROJECT_NAME}_nginx + container_name: ${PROJECT_NAME}_${APP_ENV}_nginx restart: always ports: - "${NGINX_PORT:-80}:80" @@ -73,11 +73,11 @@ services: networks: - sass-platform-net labels: - - "com.docker.compose.project.working_dir=${PROJECT_NAME}" + - "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}" db: image: mysql:5.7.44 - container_name: ${PROJECT_NAME}_mysql + container_name: ${PROJECT_NAME}_${APP_ENV}_mysql environment: <<: *shared-api-env volumes: @@ -94,12 +94,12 @@ services: - --collation-server=utf8mb4_unicode_ci - --innodb_buffer_pool_size=256M labels: - - "com.docker.compose.project.working_dir=${PROJECT_NAME}" + - "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}" # Redis 服务(可选) redis: image: redis:8.2 - container_name: ${PROJECT_NAME}_redis + container_name: ${PROJECT_NAME}_${APP_ENV}_redis environment: REDIS_PASSWORD: ${REDIS_PASSWORD:-luckyshop123!@#} REDISCLI_AUTH: ${REDIS_PASSWORD:-luckyshop123!@#} @@ -112,29 +112,32 @@ services: - sass-platform-net restart: unless-stopped labels: - - "com.docker.compose.project.working_dir=${PROJECT_NAME}" + - "com.docker.compose.project.working_dir=${PROJECT_NAME}_${APP_ENV}" volumes: mysql_db_data: + name: ${PROJECT_NAME}_${APP_ENV}_mysql_db_data driver: local driver_opts: type: none o: bind - device: ./docker/mysql_db_data + device: ./docker/mysql_db_data/${APP_ENV} redis_data: + name: ${PROJECT_NAME}_${APP_ENV}_redis_data driver: local driver_opts: type: none o: bind - device: ./docker/redis_data + device: ./docker/redis_data/${APP_ENV} xdebug_logs: + name: ${PROJECT_NAME}_${APP_ENV}_xdebug_logs driver: local driver_opts: type: none o: bind - device: ./docker/xdebug_logs + device: ./docker/xdebug_logs/${APP_ENV} networks: sass-platform-net: - name: ${PROJECT_NAME}_net + name: ${PROJECT_NAME}_${APP_ENV}_net driver: bridge \ No newline at end of file diff --git a/src/.env.development b/src/.env.development index e49319d51..8e17ceedb 100644 --- a/src/.env.development +++ b/src/.env.development @@ -6,7 +6,7 @@ DEFAULT_TIMEZONE = Asia/Shanghai default_lang = zh-cn [DATABASE] TYPE = mysql -HOSTNAME = dev-newshop_mysql +HOSTNAME = db DATABASE = shop_mallnew USERNAME = shop_mallnew PASSWORD = shop_mallnew @@ -16,7 +16,7 @@ DEBUG = true [RRDATABASE] HOSTNAME = host.docker.internal [redis] -HOST = dev-newshop_redis +HOST = redis PORT = 6379 PASSWORD = 'luckyshop123!@#' EXPIRY = 604800 \ No newline at end of file diff --git a/src/.env.local b/src/.env.local new file mode 100644 index 000000000..3afee75f3 --- /dev/null +++ b/src/.env.local @@ -0,0 +1,22 @@ +APP_DEBUG = true +APP_TRACE = true +[APP] +DEFAULT_TIMEZONE = Asia/Shanghai +[LANG] +default_lang = zh-cn +[DATABASE] +TYPE = mysql +HOSTNAME = db +DATABASE = shop_dev +USERNAME = shop_mallnew +PASSWORD = shop_mallnew +HOSTPORT = 3306 +CHARSET = utf8 +DEBUG = true +[RRDATABASE] +HOSTNAME = redis +[redis] +HOST = redis +PORT = 6379 +PASSWORD = 'luckyshop123!@#' +EXPIRY = 604800 \ No newline at end of file diff --git a/src/index.php b/src/index.php index b509ed1a2..aea6158b1 100644 --- a/src/index.php +++ b/src/index.php @@ -68,11 +68,12 @@ if ($appEnv) { if (is_file($envFile)) { $app->env->load($envFile); } -} - -// 3. 为了兼容性,如果存在.env.local也加载(优先级最高) -if (is_file(__DIR__ . '/.env.local')) { - $app->env->load(__DIR__ . '/.env.local'); +} else { + echo "⚠️ 警告:未设置APP_ENV环境变量,默认使用local环境。\n"; + // 3. 为了兼容性,如果存在.env.local也加载(优先级最高) + if (is_file(__DIR__ . '/.env.local')) { + $app->env->load(__DIR__ . '/.env.local'); + } } // 执行HTTP应用并响应 diff --git a/src/think b/src/think index 74fa7b6f8..af41fe22f 100644 --- a/src/think +++ b/src/think @@ -21,12 +21,14 @@ if ($appEnv) { if (is_file($envFile)) { $app->env->load($envFile); } +} else { + echo "⚠️ 警告:未设置APP_ENV环境变量,默认使用local环境。\n"; + // 3. 为了兼容性,如果存在.env.local也加载(优先级最高) + if (is_file(__DIR__ . '/.env.local')) { + $app->env->load(__DIR__ . '/.env.local'); + } } -// 3. 为了兼容性,如果存在.env.local也加载(优先级最高) -if (is_file(__DIR__ . '/.env.local')) { - $app->env->load(__DIR__ . '/.env.local'); -} // 应用初始化 $app->console->run(); \ No newline at end of file