1. ${NODE_ENV:-production} 语法解释
这是Docker Compose的环境变量替换语法:
${NODE_ENV:-production}表示:如果环境变量NODE_ENV存在且不为空,则使用NODE_ENV的值;否则使用默认值production:-是默认值操作符- 等价于:
NODE_ENV=${NODE_ENV:-production}
示例:
bash
# 如果 .env 文件中有 NODE_ENV=development
# 则实际值为 development
# 如果 .env 文件中没有 NODE_ENV 或为空
# 则使用默认值 production
2. Docker服务重启和更新
Docker不会自动监听文件变化,需要手动重启:
修改docker-compose.yaml后:
bash
# 停止所有服务
docker-compose down
# 重新构建并启动
docker-compose up --build -d
# 或者只重启特定服务
docker-compose restart app
修改Dockerfile后:
bash
# 强制重新构建镜像
docker-compose build --no-cache app
# 然后启动
docker-compose up -d
修改应用代码后(如果使用卷挂载):
bash
# 代码修改会自动同步到容器,但需要重启应用进程
docker-compose restart app
# 或者进入容器手动重启
docker-compose exec app pnpm run start:dev
3. restart: unless-stopped 含义
这是Docker容器的重启策略:
| 策略 | 说明 |
|---|---|
no |
不自动重启(默认) |
always |
总是重启,无论退出状态如何 |
on-failure |
只在非零退出状态时重启 |
unless-stopped |
总是重启,除非手动停止 |
unless-stopped 的优势:
- 容器异常退出时自动重启
- 系统重启后自动启动容器
- 手动停止后不会自动重启(避免干扰调试)
4. 完整的重启流程示例
bash
# 1. 停止所有服务
docker-compose down
# 2. 查看当前状态
docker-compose ps
# 3. 重新构建并启动
docker-compose up --build -d
# 4. 查看日志
docker-compose logs -f app
# 5. 检查服务状态
docker-compose ps
5. 开发环境建议
对于开发环境,建议使用卷挂载来避免频繁重建:
yaml
services:
app:
build:
context: .
dockerfile: Dockerfile
volumes:
- .:/app # 代码同步
- /app/node_modules # 避免覆盖依赖
command: pnpm run start:dev # 开发模式,支持热重载
这样代码修改后,只需要重启应用进程,不需要重新构建镜像。