本页内容
Deno 和 Docker
在 Docker 中使用 Deno 跳转到标题
Deno 提供官方 Docker 文件和镜像。
要使用官方镜像,请在您的项目目录中创建 Dockerfile
FROM denoland/deno:latest
# Create working directory
WORKDIR /app
# Copy source
COPY . .
# Compile the main app
RUN deno cache main.ts
# Run the app
CMD ["deno", "run", "--allow-net", "main.ts"]
最佳实践 跳转到标题
使用多阶段构建 跳转到标题
用于更小的生产镜像
# Build stage
FROM denoland/deno:latest as builder
WORKDIR /app
COPY . .
RUN deno cache main.ts
# Production stage
FROM denoland/deno:latest
WORKDIR /app
COPY --from=builder /app .
CMD ["deno", "run", "--allow-net", "main.ts"]
权限标志 跳转到标题
明确指定所需权限
CMD ["deno", "run", "--allow-net=api.example.com", "--allow-read=/data", "main.ts"]
开发容器 跳转到标题
用于支持热重载的开发
FROM denoland/deno:latest
WORKDIR /app
COPY . .
CMD ["deno", "run", "--watch", "--allow-net", "main.ts"]
常见问题和解决方案 跳转到标题
-
权限拒绝错误
- 正确使用
--allow-*
标志 - 考虑使用
deno.json
权限
- 正确使用
-
大镜像大小
- 使用多阶段构建
- 只包含必要文件
- 添加正确的
.dockerignore
-
缓存失效
- 分离依赖缓存
- 使用正确的层顺序
.dockerignore 示例 跳转到标题
.git
.gitignore
Dockerfile
README.md
*.log
_build/
node_modules/
可用的 Docker 标签 跳转到标题
Deno 提供几种官方标签
denoland/deno:latest
- 最新稳定版本denoland/deno:alpine
- 基于 Alpine 的更小镜像denoland/deno:distroless
- 基于 Google distroless 的镜像denoland/deno:ubuntu
- 基于 Ubuntu 的镜像denoland/deno:1.x
- 特定版本标签
环境变量 跳转到标题
Deno 在 Docker 中的常见环境变量
ENV DENO_DIR=/deno-dir/
ENV DENO_INSTALL_ROOT=/usr/local
ENV PATH=${DENO_INSTALL_ROOT}/bin:${PATH}
# Optional environment variables
ENV DENO_NO_UPDATE_CHECK=1
ENV DENO_NO_PROMPT=1
在 Docker 中运行测试 跳转到标题
FROM denoland/deno:latest
WORKDIR /app
COPY . .
# Run tests
CMD ["deno", "test", "--allow-none"]
使用 Docker Compose 跳转到标题
// filepath: docker-compose.yml
version: "3.8"
services:
deno-app:
build: .
volumes:
- .:/app
ports:
- "8000:8000"
environment:
- DENO_ENV=development
command: ["deno", "run", "--watch", "--allow-net", "main.ts"]
健康检查 跳转到标题
HEALTHCHECK --interval=30s --timeout=3s \
CMD deno eval "try { await fetch('http://localhost:8000/health'); } catch { Deno.exit(1); }"
常见开发工作流 跳转到标题
用于本地开发
- 构建镜像:
docker build -t my-deno-app .
- 使用卷挂载运行
docker run -it --rm \
-v ${PWD}:/app \
-p 8000:8000 \
my-deno-app
安全注意事项 跳转到标题
- 以非 root 用户运行
# Create deno user
RUN addgroup --system deno && \
adduser --system --ingroup deno deno
# Switch to deno user
USER deno
# Continue with rest of Dockerfile
- 使用最小权限
CMD ["deno", "run", "--allow-net=api.example.com", "--allow-read=/app", "main.ts"]
- 考虑使用
--deny-*
标志以提高安全性
在 Docker 中使用工作区 跳转到标题
在 Docker 中使用 Deno 工作区(monorepos)时,主要有两种方法
1. 完整工作区容器化 跳转到标题
当您需要所有依赖项时,包含整个工作区
FROM denoland/deno:latest
WORKDIR /app
# Copy entire workspace
COPY deno.json .
COPY project-a/ ./project-a/
COPY project-b/ ./project-b/
WORKDIR /app/project-a
CMD ["deno", "run", "-A", "mod.ts"]
2. 最小化工作区容器化 跳转到标题
对于更小的镜像,只包含所需的工作区成员
- 创建构建上下文结构
project-root/
├── docker/
│ └── project-a/
│ ├── Dockerfile
│ ├── .dockerignore
│ └── build-context.sh
├── deno.json
├── project-a/
└── project-b/
- 创建
.dockerignore
// filepath: docker/project-a/.dockerignore
*
!deno.json
!project-a/**
!project-b/** # Only if needed
- 创建构建上下文脚本
// filepath: docker/project-a/build-context.sh
#!/bin/bash
# Create temporary build context
BUILD_DIR="./tmp-build-context"
mkdir -p $BUILD_DIR
# Copy workspace configuration
cp ../../deno.json $BUILD_DIR/
# Copy main project
cp -r ../../project-a $BUILD_DIR/
# Copy only required dependencies
if grep -q "\"@scope/project-b\"" "../../project-a/mod.ts"; then
cp -r ../../project-b $BUILD_DIR/
fi
- 创建最小化 Dockerfile
// filepath: docker/project-a/Dockerfile
FROM denoland/deno:latest
WORKDIR /app
# Copy only necessary files
COPY deno.json .
COPY project-a/ ./project-a/
# Copy dependencies only if required
COPY project-b/ ./project-b/
WORKDIR /app/project-a
CMD ["deno", "run", "-A", "mod.ts"]
- 构建容器
cd docker/project-a
./build-context.sh
docker build -t project-a -f Dockerfile tmp-build-context
rm -rf tmp-build-context
最佳实践 跳转到标题
- 始终包含根
deno.json
文件 - 保持与开发时相同的目录结构
- 清晰地记录工作区依赖项
- 使用构建脚本管理上下文
- 只包含所需的工作区成员
- 当依赖项更改时更新
.dockerignore