Dockerfile 参考

Dockerfile 参考

概述Dockerfile 是一个文本文件,包含了构建 Docker 镜像所需的所有命令。Docker 通过读取 Dockerfile 中的指令自动构建镜像。本文档详细介绍了 Dockerfile 的格式和支持的指令。

Dockerfile 必须以大写 D 开头命名为 Dockerfile,除非使用 -f 参数指定其他文件名。基本结构Dockerfile 由一系列指令和参数组成。每条指令都必须大写,后面跟随相应的参数。

# 注释

FROM ubuntu:20.04

LABEL maintainer="your-email@example.com"

RUN apt-get update && apt-get install -y nginx

COPY . /app

WORKDIR /app

CMD ["nginx", "-g", "daemon off;"]Copy code基础指令FROM指定基础镜像,是 Dockerfile 中必须存在的第一条指令。

语法FROM 指令支持以下几种格式:

FROM

FROM :

FROM @Copy code可以在同一个 Dockerfile 中使用多个 FROM 指令来创建多阶段构建。WORKDIR设置工作目录,影响后续的 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指令。

语法WORKDIR /path/to/workdirCopy codeCOPY从构建上下文复制文件或目录到容器中。

语法COPY [--chown=:] ...

COPY [--chown=:] ["",... ""]Copy codeADD类似 COPY,但支持 URL 和自动解压 tar 文件。建议优先使用 COPY,除非需要 ADD 的特殊功能。

语法ADD [--chown=:] ...

ADD [--chown=:] ["",... ""]Copy codeRUN在当前镜像之上执行命令并创建新的镜像层。每个 RUN 指令都会创建一个新的镜像层。

语法RUN 指令支持 shell 格式和 exec 格式:

# Shell 格式

RUN command

# Exec 格式

RUN ["executable", "param1", "param2"]Copy codeCMD指定容器启动时要运行的命令。一个 Dockerfile 中只能有一个 CMD 指令。如果指定了多个,只有最后一个会生效。

语法CMD 指令支持三种格式:

# Exec 格式(推荐)

CMD ["executable","param1","param2"]

# 作为 ENTRYPOINT 的默认参数

CMD ["param1","param2"]

# Shell 格式

CMD command param1 param2Copy codeENTRYPOINT配置容器启动时运行的可执行文件。ENTRYPOINT 的主要用途是将容器作为可执行程序使用。

语法# Exec 格式(推荐)

ENTRYPOINT ["executable", "param1", "param2"]

# Shell 格式

ENTRYPOINT command param1 param2Copy code环境和参数ENV设置环境变量,这些变量在构建过程中和容器运行时都可用。

语法ENV = ...

ENV Copy codeARG定义构建参数,这些参数只在构建过程中可用,容器运行时不可用。

语法ARG [=]Copy code元数据LABEL为镜像添加元数据,比如维护者信息、版本信息等。

语法LABEL = = = ...Copy code最佳实践使用多阶段构建使用多阶段构建可以显著减小最终镜像的大小。在编译阶段使用包含编译工具的镜像,在运行阶段只复制编译后的文件。

FROM golang:1.21 AS builder

WORKDIR /app

COPY . .

RUN go build -o main

FROM alpine:latest

COPY --from=builder /app/main /main

CMD ["/main"]Copy code合并 RUN 指令合并多个 RUN 指令可以减少镜像层数,从而减小镜像大小。使用 && 连接多个命令,并在最后清理缓存。

RUN apt-get update && apt-get install -y package1 package2 && rm -rf /var/lib/apt/lists/*Copy code使用 .dockerignore使用 .dockerignore 文件排除不需要的文件,可以加快构建速度并减小构建上下文的大小。

node_modules

npm-debug.log

Dockerfile

.dockerignore

.git

.gitignoreCopy code选择合适的基础镜像使用官方镜像,优先选择 alpine 版本以减小镜像大小。确保使用具体的标签而不是 latest。

FROM node:18-alpineCopy code完整示例Node.js 应用示例# 使用 Node.js Alpine 作为基础镜像

FROM node:18-alpine

# 设置工作目录

WORKDIR /app

# 复制 package.json 和 package-lock.json

COPY package*.json ./

# 安装依赖

RUN npm ci --only=production

# 复制源代码

COPY . .

# 暴露端口

EXPOSE 3000

# 启动应用

CMD ["npm", "start"]Copy codeGo 应用多阶段构建示例# 构建阶段

FROM golang:1.21-alpine AS builder

WORKDIR /app

# 复制 Go 模块文件

COPY go.* ./

RUN go mod download

# 复制源代码

COPY . .

# 构建应用

RUN CGO_ENABLED=0 GOOS=linux go build -o main

# 运行阶段

FROM alpine:latest

RUN apk --no-cache add ca-certificates

WORKDIR /root/

# 从构建阶段复制二进制文件

COPY --from=builder /app/main .

# 运行应用

CMD ["./main"]Copy code

相关推荐

小天才电话手表怎么存电话号 小天才电话手表存号码方法
365bet最快线路监测中心

小天才电话手表怎么存电话号 小天才电话手表存号码方法

📅 08-04 👁️ 6290
手机助手的实用功能与使用指南
365BET导航

手机助手的实用功能与使用指南

📅 08-21 👁️ 6553
快速提升权谋布局能力的三大方法,聪明人都在学
365bet取款要多久到账

快速提升权谋布局能力的三大方法,聪明人都在学

📅 07-06 👁️ 5362
同花顺数据库如何导出
365BET导航

同花顺数据库如何导出

📅 07-23 👁️ 6269
一个可以赚钱的网盘副业项目——城通网盘【适合新手操作】
365bet取款要多久到账

一个可以赚钱的网盘副业项目——城通网盘【适合新手操作】

📅 07-07 👁️ 3582
「微享加
365BET导航

「微享加

📅 08-10 👁️ 6069
卋罖是什么意思 卋罖怎么解释
365BET导航

卋罖是什么意思 卋罖怎么解释

📅 06-27 👁️ 2726
天子香烟全部系列价格表图解最新版
365bet取款要多久到账

天子香烟全部系列价格表图解最新版

📅 07-16 👁️ 588
男篮世界杯分组揭晓 中国男篮“直通巴黎”难度不小
365bet最快线路监测中心

男篮世界杯分组揭晓 中国男篮“直通巴黎”难度不小

📅 07-11 👁️ 1155
巴西4-3惊险战胜智利 晋级世界杯八强
365bet最快线路监测中心

巴西4-3惊险战胜智利 晋级世界杯八强

📅 08-06 👁️ 1171
怎样在qq视频上给对方播放视频文件 方法介绍
365bet取款要多久到账

怎样在qq视频上给对方播放视频文件 方法介绍

📅 08-15 👁️ 8802
金笔怎么买?钢笔进阶选购科普~20款品牌经典使用分享!附好价推荐~