Writing Skills
writing-skills
效率与协作技能,来自 obra/superpowers,查看原文获取完整用途和操作说明。
create-dockerfile【部署与运维】Create general-purpose Dockerfiles for Node.js, Python, Go, Rust, and Java projects. Covers base image selection, dependency installation, user permissions, COPY patterns, ENTRYPOINT vs CMD, and .dockerignore. Use when containerizing an application for the first time, creating a consistent build/runtime environment, preparing an app for cloud deploym…
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
為通用應用建可產之 Dockerfile。
npm start、python app.py)| 語 | 開發像 | 產像 | 尺 |
|---|---|---|---|
| Node.js | node:22-bookworm | node:22-bookworm-slim | ~200MB |
| Python | python:3.12-bookworm | python:3.12-slim-bookworm | ~150MB |
| Go | golang:1.23-bookworm | gcr.io/distroless/static | ~2MB |
| Rust | rust:1.82-bookworm | debian:bookworm-slim | ~80MB |
| Java | eclipse-temurin:21-jdk | eclipse-temurin:21-jre | ~200MB |
得: 為產像擇 slim/distroless 變。
FROM node:22-bookworm-slim
RUN groupadd -r appuser && useradd -r -g appuser -m appuser
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --omit=dev
COPY . .
USER appuser
EXPOSE 3000
CMD ["node", "src/index.js"]
FROM python:3.12-slim-bookworm
RUN groupadd -r appuser && useradd -r -g appuser -m appuser
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
USER appuser
EXPOSE 8000
CMD ["python", "app.py"]
FROM golang:1.23-bookworm AS builder
WORKDIR /src
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o /app/server ./cmd/server
FROM gcr.io/distroless/static
COPY --from=builder /app/server /server
EXPOSE 8080
ENTRYPOINT ["/server"]
FROM rust:1.82-bookworm AS builder
WORKDIR /src
COPY Cargo.toml Cargo.lock ./
RUN mkdir src && echo "fn main() {}" > src/main.rs && cargo build --release && rm -rf src
COPY . .
RUN touch src/main.rs && cargo build --release
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
COPY --from=builder /src/target/release/myapp /usr/local/bin/myapp
EXPOSE 8080
ENTRYPOINT ["myapp"]
FROM eclipse-temurin:21-jdk AS builder
WORKDIR /src
COPY pom.xml .
RUN mvn dependency:go-offline -B
COPY src ./src
RUN mvn package -DskipTests
FROM eclipse-temurin:21-jre
COPY --from=builder /src/target/*.jar /app/app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
得: docker build -t myapp . 無訛而畢。
敗則: 察基像之可得與依裝命令。
| 指令 | 用 | 覆蓋 |
|---|---|---|
ENTRYPOINT | 定執 | 以 --entrypoint 覆 |
CMD | 默參 | 以尾參覆 |
| 二者 | ENTRYPOINT + CMD 之默參 | 參唯覆 CMD |
ENTRYPOINT 用於有單一志之編譯二進。CMD 用於解釋語,或欲 docker run myapp bash 者。
.git
.gitignore
node_modules
__pycache__
*.pyc
target/
.env
.env.*
*.md
!README.md
.vscode
.idea
Dockerfile
docker-compose*.yml
得: 建脈排開發之物。
產境宜以非根運:
RUN groupadd -r appuser && useradd -r -g appuser -m appuser
USER appuser
distroless 像用內置之 nonroot:
FROM gcr.io/distroless/static:nonroot
USER nonroot
docker build -t myapp:latest .
docker run --rm myapp:latest
docker image inspect myapp:latest --format '{{.Size}}'
得: 容器起,於期埠應,以非根運。
敗則: 以 docker logs 察誌。驗 WORKDIR、COPY 路、暴露之埠。
docker build 無訛而畢.dockerignore 排無謂之文件.env 烤入像node_modules 或 .git 送入建脈費時費盤。latest:宜釘特版(如 node:22.11.0)以重現。--no-cache-dir:Python pip 默緩存包,脹像。ADD 自解),宜用 COPY。create-r-dockerfile — R 專用 Dockerfile,用 rocker 像create-multistage-dockerfile — 多階段之法以最小產像optimize-docker-build-cache — 進階緩之策setup-compose-stack — 以他服協已容器化之應