deno.com
本页内容

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"]

常见问题和解决方案 跳转到标题

  1. 权限拒绝错误

    • 正确使用 --allow-* 标志
    • 考虑使用 deno.json 权限
  2. 大镜像大小

    • 使用多阶段构建
    • 只包含必要文件
    • 添加正确的 .dockerignore
  3. 缓存失效

    • 分离依赖缓存
    • 使用正确的层顺序

.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); }"

常见开发工作流 跳转到标题

用于本地开发

  1. 构建镜像: docker build -t my-deno-app .
  2. 使用卷挂载运行
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. 最小化工作区容器化 跳转到标题

对于更小的镜像,只包含所需的工作区成员

  1. 创建构建上下文结构
project-root/
├── docker/
│   └── project-a/
│       ├── Dockerfile
│       ├── .dockerignore
│       └── build-context.sh
├── deno.json
├── project-a/
└── project-b/
  1. 创建 .dockerignore
// filepath: docker/project-a/.dockerignore
*
!deno.json
!project-a/**
!project-b/**  # Only if needed
  1. 创建构建上下文脚本
// 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
  1. 创建最小化 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"]
  1. 构建容器
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

您找到所需内容了吗?

隐私政策