【部署】Dockerfile 指令备忘清单(超级详细!)

ops/2025/3/6 18:02:45/

文章目录

    • Dockerfile 指令
      • 继承
      • 继承
      • 变量 ENV
      • 初始化
      • Onbuild
      • 在严格的 shell 中运行命令
      • 命令 CMD
      • 入口点 ENTRYPOINT
      • 元数据 LABEL
      • ARG
      • .dockerignore 文件
      • 主要命令
    • Dockerfile 示例
      • 服务静态网站的最小 Docker 镜像
      • Docker 镜像多阶段构建
    • 参考

这是 Dockerfile 的快速参考备忘单。包含用户可以在命令行上调用以组装镜像的所有命令。

Dockerfile__7">Dockerfile 指令

继承

默认 Dockerfile 位于上下文的根目录中。

  • Docker 备忘清单 (github.io)
docker build -f /path/to/a/Dockerfile .

使用 -f 指向文件系统中任何位置的 Dockerfile

继承

dockerfile">FROM [--platform=<platform>] <image> [AS <name>]

示例

dockerfile">FROM ruby:3.3.0
FROM golang:1.20-alpine3.16 AS build-env

变量 ENV

dockerfile">ENV <key>=<value> ...
dockerfile">ENV APP_HOME /myapp
RUN mkdir $APP_HOME
dockerfile">ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \MY_CAT=fluffy

初始化

dockerfile">RUN bundle install

WORKDIR 指令为任何 RUNCMDENTRYPOINTCOPYADD 指令设置工作目录。

dockerfile">WORKDIR /myapp

VOLUME 指令创建一个具有指定名称的挂载点,并将其标记为保存来自本机主机或其他容器的外部挂载卷。

dockerfile">VOLUME ["/data"]
# 安装点规范
dockerfile">ADD file.xyz /file.xyz
# 复制
COPY --chown=user:group host_file.xyz /path/container_file.xyz

Onbuild

dockerfile">ONBUILD RUN bundle install
# 与另一个文件一起使用时ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src

指令将触发指令添加到镜像中,以便稍后执行,此时镜像用作另一个构建的基础。

在严格的 shell 中运行命令

dockerfile">ENV my_var
SHELL ["/bin/bash", "-euo", "pipefail", "-c"]
# 使用严格模式:
RUN false         # ails 像使用 && 一样构建
RUN echo "$myvar" # 由于拼写错误会抛出错误
RUN true | false  # 将脱离管道

使用 shell 将为 shell 命令打开严格模式。

命令 CMD

:--
CMD ["executable","param1","param2"](exec 形式,这是首选形式)
CMD ["param1","param2"](作为 ENTRYPOINT 的默认参数)
CMD command param1 param2(shell形式)
dockerfile">EXPOSE 5900
CMD ["bundle", "exec", "rails", "server"]

入口点 ENTRYPOINT

dockerfile">ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2

配置将作为可执行文件运行的容器。

dockerfile">ENTRYPOINT exec top -b

这将使用 shell 处理来替换 shell 变量,并将忽略任何 CMDdocker run 命令行参数。

元数据 LABEL

dockerfile">LABEL version="1.0"
dockerfile">LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
dockerfile">LABEL description="本文说明\
标签值可以跨越多行。"
LABEL multi.label1="value1" \multi.label2="value2" \other="value3"

ARG

dockerfile">ARG <name>[=<default value>]

指令定义了一个变量,在构建时通过 docker build 命令使用 --build-arg <varname>=<value> 标志将其传递给构建器。

dockerfile">FROM busybox
# user1 默认值为 someuser
ARG user1=someuser
ARG buildno=1

dockerignore__172">.dockerignore 文件

# 注释说明
*/temp*
*/*/temp*
temp?
:--
# comment忽略
*/temp*在根的任何直接子目录中
排除名称以 temp 开头的文件和目录
*/*/temp*从根以下两级的任何子目录中
排除以 temp 开头的文件和目录
temp?排除根目录中名称为
temp 的单字符扩展名的文件和目录

如果此文件存在,排除与其中的模式匹配的文件和目录,有利于避免 ADDCOPY 将敏感文件添加到镜像中。匹配是使用 Go 的 filepath.Match 规则完成的。

主要命令

命令说明
FROM image构建的基础镜像
MAINTAINER email(已弃用)维护者的名字
COPY [--chown=<user>:<group>] <src>... <dest>将上下文中的路径复制到位置 dest 的容器中
ADD [--chown=<user>:<group>] <src>... <dest>COPY 相同,但解压缩存档并接受 http url。
RUN <command>在容器内运行任意命令。
USER <user>[:<group>]设置默认用户名。
WORKDIR /path/to/workdir设置默认工作目录。
CMD command param1 param2设置默认命令
ENV <key>=<value> ...设置环境变量
EXPOSE <port> [<port>/<protocol>...]运行时侦听指定的网络端口

Dockerfile__208">Dockerfile 示例

服务静态网站的最小 Docker 镜像

dockerfile">FROM wcjiang/docker-static-website:latest
# 使用 .dockerignore 文件来控制镜像中的内容!
# 复制当前目录内容,到容器中
COPY ./ .

这会产生一个 154KB + 的单层镜像。 如果您需要以不同的方式配置 httpd,您可以覆盖 CMD 行:

dockerfile">FROM wcjiang/docker-static-website:latest
COPY . .CMD ["/busybox","httpd","-f","-v","-p","3000","-c","httpd.conf"]

缩小镜像过程查看原文,镜像 Dockerfile 源码。

Docker 镜像多阶段构建

dockerfile">FROM golang:alpine as builder
RUN apk --no-cache add git
WORKDIR /go/src/github.com/go/helloworld/
RUN go get -d -v github.com/go-sql-driver/mysql
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .FROM alpine:latest as prod
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/go/helloworld/app .
CMD ["./app"]

使用多阶段构建能将构建依赖留在 builder 镜像中,只将编译完成后的二进制文件拷贝到运行环境中,大大减少镜像体积。

参考


http://www.ppmy.cn/ops/163659.html

相关文章

FastGPT 引申:信息抽取到知识图谱的衔接流程

文章目录 信息抽取到知识图谱的衔接流程步骤1&#xff1a;原始信息抽取结果步骤2&#xff1a;数据标准化处理&#xff08;Python示例&#xff09;步骤3&#xff1a;Cypher代码动态生成&#xff08;Python驱动&#xff09; 关键衔接逻辑说明1. 唯一标识符生成规则2. 数据映射策略…

摄相机标定的基本原理

【相机标定的基本原理与经验分享】https://www.bilibili.com/video/BV1eE411c7kr?vd_source7c2b5de7032bf3907543a7675013ce3a 相机模型&#xff1a; 定义&#xff1a; 内参&#xff1a;就像相机的“眼睛”。它描述了相机内部的特性&#xff0c;比如焦距&#xff08;镜头的放…

基于Matlab的语音识别系统设计

摘要 在通信技术的不断进步发展下&#xff0c;语音识别技术也取得了令人瞩目的成就&#xff0c;人们对语音识别技术的性能要求也越来越高。语音识别技术是通常以人们说话的内容作为识别对象的一项技术&#xff0c;凭借其安全高效、价格低廉、易于实现等特点&#xff0c;能与其…

深入解析嵌入式硬件设计中的十大总线:特性对比与实战“避坑”指南

深入解析嵌入式硬件设计中的十大总线:特性对比与实战“避坑”指南 目录1. 命运多舛的经典:UART、SPI、IC1.1 UART:简单背后的魔鬼细节1.2 SPI:速度与干扰的平衡木1.3 IC:多主从架构的死亡交叉2. 工业与汽车战场:CAN、LIN、RS-4852.1 CAN总线:差分信号的终极防御2.2 LIN总…

【基础4】插入排序

核心思想 插入排序是一种基于元素比较的原地排序算法&#xff0c;其核心思想是将数组分为“已排序”和“未排序”两部分&#xff0c;逐个将未排序元素插入到已排序部分的正确位置。 例如扑克牌在理牌的时候&#xff0c;一般会将大小王、2、A、花牌等按大小顺序插入到左边&…

【机器学习chp10】降维——(核化)PCA + MDS + lsomap + 拉普拉斯特征映射 + t-NSE + UMAP

目录 一、降维的意义与本质 1、意义 2、本质 3、常见降维方法 &#xff08;1&#xff09;线性降维 &#xff08;2&#xff09;非线性降维 二、基于重构的降维 1、PCA 2、核化PCA &#xff08;1&#xff09;实现过程 步骤一&#xff1a;数据映射与核函数定义 步骤二…

deepseek+mermaid【自动生成流程图】

成果&#xff1a; 第一步打开deepseek官网(或百度版&#xff08;更快一点&#xff09;)&#xff1a; 百度AI搜索 - 办公学习一站解决 第二步&#xff0c;生成对应的Mermaid流程图&#xff1a; 丢给deepseek代码&#xff0c;或题目要求 生成mermaid代码 第三步将代码复制到me…

安全见闻5,6

人工智能篇 人工智能目前处于高数发展阶段,所涉及的安全问题也很多 ai所收集的数据有泄露的风险(数据安全) ai进行工作的时候可能因为收集的恶意信息而产生错误(对抗攻击) ai模型被逆向窃取的风险,涉及到知识产权被侵犯的问题 ai被用作与恶意网络攻击的风险 同时要搞好ai…