promovaweb-devops-dockerfile-basics

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Skill de Fundamentos de Dockerfile

Dockerfile基础知识Skill

Domine os fundamentos do Dockerfile e as melhores práticas de 2024-2025 para criar imagens de container seguras e otimizadas.
掌握Dockerfile的基础知识以及2024-2025年的最佳实践,构建安全且优化的容器镜像。

Propósito

目标

Fornecer orientação abrangente sobre a sintaxe do Dockerfile, ordenação de instruções, otimização de camadas (layers) e melhores práticas de segurança.
提供关于Dockerfile语法、指令排序、层(layers)优化以及安全最佳实践的全面指导。

Parâmetros

参数

ParâmetroTipoObrigatórioPadrãoDescrição
base_imagestringNão-Imagem base a ser utilizada
languagestringNão-Linguagem de programação (node/python/go/java)
optimizebooleanNãotrueAplicar recomendações de otimização
参数类型必填默认值描述
base_imagestring-要使用的基础镜像
languagestring-编程语言(node/python/go/java)
optimizebooleantrue应用优化建议

Instruções Principais

核心指令

Referência de Instruções

指令参考

InstruçãoPropósitoExemplo
FROMImagem base
FROM node:20-alpine
WORKDIRDefine o diretório de trabalho
WORKDIR /app
COPYCopia arquivos
COPY package*.json ./
RUNExecuta um comando
RUN npm ci
ENVDefine variáveis de ambiente
ENV NODE_ENV=production
EXPOSEDocumenta a porta
EXPOSE 3000
USERDefine o usuário
USER appuser
CMDComando padrão
CMD ["node", "app.js"]
ENTRYPOINTComando fixo
ENTRYPOINT ["./start.sh"]
HEALTHCHECKVerificação de integridade
HEALTHCHECK CMD curl -f http://localhost/
指令用途示例
FROM基础镜像
FROM node:20-alpine
WORKDIR定义工作目录
WORKDIR /app
COPY复制文件
COPY package*.json ./
RUN执行命令
RUN npm ci
ENV定义环境变量
ENV NODE_ENV=production
EXPOSE声明端口
EXPOSE 3000
USER指定运行用户
USER appuser
CMD默认执行命令
CMD ["node", "app.js"]
ENTRYPOINT固定入口命令
ENTRYPOINT ["./start.sh"]
HEALTHCHECK健康检查
HEALTHCHECK CMD curl -f http://localhost/

Ordem de Otimização de Camadas (Layers)

层(Layers)优化顺序

dockerfile
undefined
dockerfile
undefined

1. Imagem base (mais estável)

1. 基础镜像(最稳定)

FROM node:20-alpine
FROM node:20-alpine

2. Dependências do sistema

2. 系统依赖

RUN apk add --no-cache curl
RUN apk add --no-cache curl

3. Criar usuário (segurança)

3. 创建运行用户(安全要求)

RUN addgroup -g 1001 app && adduser -u 1001 -G app -D app
RUN addgroup -g 1001 app && adduser -u 1001 -G app -D app

4. Definir diretório de trabalho

4. 定义工作目录

WORKDIR /app
WORKDIR /app

5. Copiar arquivos de dependência (camada de cache)

5. 复制依赖声明文件(缓存层)

COPY package*.json ./
COPY package*.json ./

6. Instalar dependências

6. 安装依赖

RUN npm ci --only=production
RUN npm ci --only=production

7. Copiar código da aplicação (mais volátil)

7. 复制应用代码(变更最频繁)

COPY --chown=app:app . .
COPY --chown=app:app . .

8. Mudar para usuário não-root

8. 切换为非root用户运行

USER app
USER app

9. Health check

9. 健康检查

HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost:3000/health || exit 1
HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost:3000/health || exit 1

10. Comando padrão

10. 默认启动命令

CMD ["node", "server.js"]
undefined
CMD ["node", "server.js"]
undefined

Melhores Práticas (2024-2025)

最佳实践(2024-2025)

Essenciais de Segurança

安全核心要点

dockerfile
undefined
dockerfile
undefined

Sempre use tags de versão específicas

始终使用具体的版本标签

FROM node:20.10-alpine # Bom
FROM node:20.10-alpine # 推荐

FROM node:latest # Ruim

FROM node:latest # 不推荐

Executar como usuário não-root

以非root用户运行

USER nonroot
USER nonroot

Usar multi-stage builds

使用多阶段构建

FROM node:20 AS builder
FROM node:20 AS builder

... passos de build ...

... 构建步骤 ...

FROM node:20-alpine AS runtime COPY --from=builder /app/dist ./
undefined
FROM node:20-alpine AS runtime COPY --from=builder /app/dist ./
undefined

Técnicas de Otimização

优化技巧

dockerfile
undefined
dockerfile
undefined

Combinar comandos RUN

合并RUN命令

RUN apt-get update &&
apt-get install -y --no-install-recommends curl &&
rm -rf /var/lib/apt/lists/*
RUN apt-get update &&
apt-get install -y --no-install-recommends curl &&
rm -rf /var/lib/apt/lists/*

Usar .dockerignore

使用.dockerignore文件

node_modules, .git, *.md, etc.

排除node_modules、.git、*.md等文件

Aproveitar BuildKit cache mounts

利用BuildKit缓存挂载

RUN --mount=type=cache,target=/root/.npm npm ci
undefined
RUN --mount=type=cache,target=/root/.npm npm ci
undefined

Tratamento de Erros

错误处理

Erros Comuns

常见错误

ErroCausaSolução
COPY failed: file not found
Arquivo fora do contextoVerifique o .dockerignore
returned non-zero code: 127
Comando não encontradoInstale o pacote primeiro
permission denied
Executando como não-rootUse COPY --chown
错误原因解决方案
COPY failed: file not found
文件不在构建上下文内检查.dockerignore配置
returned non-zero code: 127
命令不存在先安装对应的依赖包
permission denied
非root用户无权限使用COPY --chown参数

Comandos de Validação

校验命令

bash
undefined
bash
undefined

Lint do Dockerfile

Dockerfile语法检查

hadolint Dockerfile
hadolint Dockerfile

Build sem cache

无缓存构建

docker build --no-cache -t app:test .
docker build --no-cache -t app:test .

Inspecionar camadas (layers)

查看镜像层信息

docker history app:test
undefined
docker history app:test
undefined

Solução de Problemas (Troubleshooting)

问题排查(Troubleshooting)

Checklist de Depuração

调试检查清单

  • O .dockerignore exclui arquivos desnecessários?
  • A tag da imagem base é específica (não :latest)?
  • As dependências foram copiadas antes do código-fonte?
  • O usuário não-root está configurado?
  • HEALTHCHECK está definido?
  • .dockerignore是否排除了不必要的文件?
  • 基础镜像是否使用了具体标签(而非:latest)?
  • 依赖文件是否早于源代码复制?
  • 是否配置了非root运行用户?
  • 是否定义了HEALTHCHECK?

Problemas Comuns

常见问题

SintomaCausaCorreção
Tamanho grande da imagemSem multi-stageAdicione um estágio de build
Builds lentosOrdem de camadas ruimMova o COPY para depois das dependências
Avisos de segurançaUsuário rootAdicione a instrução USER
现象原因修复方法
镜像体积过大未使用多阶段构建新增构建阶段
构建速度慢层顺序不合理将依赖复制步骤移到代码复制之前
安全告警使用root用户运行添加USER指令指定非root用户

Uso

使用方式

Skill("dockerfile-basics")
Skill("dockerfile-basics")

Skills Relacionadas

相关Skill

  • docker-multi-stage
  • docker-optimization
  • docker-security
  • docker-multi-stage
  • docker-optimization
  • docker-security