Dockerfile指令

本文详细解析Dockerfile中的关键指令,如FROM、LABEL、COPY、ADD、WORKDIR、VOLUME、EXPOSE、ENV、RUN、CMD、ENTRYPOINT、USER、HEALTHCHECK、SHELL、STOPSIGNAL、ARG、ONBUILD等,帮助读者理解各指令的功能及使用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 FROM

     FROM指令最为重要,必须为Dockerfile文件开篇的第1个非注释行,用于为镜像文件构建过程中指定基准镜像

Syntax

   FROM <repository>[:<tag>]

   FROM <repository>@<digest>

 

LABLE

   指定镜像的元数据,使用键值对来表示

 Syntax

     LABLE  <key>=<value>

 

COPY

    Copy指令用于从主机复制文件到新创建的镜像文件

 Syntax

     COPY <src> ... <dst>

     COPY ["<src>" ... "<dst>"]     

            -----建议dst使用绝对路径,否则以WORKDIR为起始路径

            -----如果路径中有空白字符,则使用第二种方式

文件复制准则

  <src>必须是build上下文中的路径,不能是父目录中的文件

  如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录自身不会被复制    ---- 相当于  copy -r src/*

  如果指定了多个<src>或在<src>中使用通配符,则dst必须是一个目录,且必须以 / 结尾

  如果dst事先不存在,他将会被自动创建,包括其父目录

 

ADD

 ADD指令类似于COPY指令,ADD支持使用TAR文件和URL路径

 Syntax

     ADD <src> ... <dst>

     ADD ["<src>" ... "<dst>"]     

操作准则,

   同COPY指令

   如果<src>为url,且<dst>不以 / 结尾,则<src>被下载并创建为<dst>

   如果<src>为url,且<dst>以 / 结尾,则<src>被下载并创建为<dst>/<filename>

   如果<src>是本地系统上的压缩格式tar文件,它将被展开为目录     ---- 相当于  tar -x

   如果<src>是网络系统上的压缩格式tar文件,它将不会被展开

 

WORKDIR

  用于为RUN、CMD、ENTRYPOINT、COPY、ADD设定工作目录

  WORKDIR可以出现多次,也可以调用由ENV定义的变量

 

VOLUME

   用于在image中创建一个挂载点目录,以挂载Docker host上的卷或其他容器上的卷

 Syntax

     VOLUME <mountpoint>

    如果挂载点目录路径下,此前的文件存在,docker run命令会在卷挂载完成后将此前所有文件复制到新挂载的卷中

 

EXPOSE

  用于为容器打开指定要监听的端口(待暴露端口,待docker run时,-P将其暴露)

 Syntax

     EXPOSE <port>[/<protocol>]  [<port>[/<protocol>]...]

  EXPOSE只能指定端口不能指定地址,不能指定宿主机端口(显然)

  例如:

     EXPOSE  12345/tcp  12345/udp

 

ENV

  用于定义环境变量,并被其后的命令(ENV、COPY、ADD等)所调用

  调用格式为 $variable_name 或 ${variable_name}

 Syntax

   ENV <key> <value>           ----定义一个变量 第一个空白字符之后的通通为value,value可加引号

   ENV <key>=<value> ...      ----定义多个变量  value可加引号

 

RUN

 Dockerfile构建镜像时(docker build)运行的命令 (此命令,基础镜像必须提供)

 RUN可运行多次,但建议尽量运行在一行以减少镜像层数

CMD

  将镜像启动为容器时的默认命令

 Syntax

    CMD  <command>                                                   ----默认使用"/bin/sh -c"解析

    CMD ["<executable>","<param1>","<param2>"]     ----默认使用内核解析

    CMD ["<param1>","<param2>"]                              ----将参数传递给后续的ENTRYPOINT

ENTRYPOINT

  将镜像启动为容器时的默认命令,与CMD不同的是,ENTRYPOINT命令不能被docker run后的内容覆盖,

且docker run后面的内容将作为参数传递给ENTRYPOINT

 

USER

用于指定运行程序的用户名或OID,默认container运行身份为root

 Syntax

     USER <UID> | <UserName>

    注意,UID或UserName必须为容器中存在的用户

   

HEALTHCHECK

   指定容器中检测自身健康状态的指令,比如检测webserver是否能够正常提供服务(叫做正常),而不是该容器是否正在运行(叫做正常)

HEALTHCHECK

     --interval=DURATION (default:30s)

     --timeout=DURATION (default:30s)

     --start-period=DURATION (default:0s)

     --retries=N (default:3)

 命令的退出状态表示容器的健康状态

   0:success

   1:unhealthy

   2:reserved

示例:

  HEALTHCHECK --interval=5m --timeout=3s  \

    CMD curl -f http://localhost/ || exit 1

 

SHELL

  覆盖命令的shell模式所使用的默认shell

 

STOPSIGNAL

默认的stop-signal是SIGTERM,在docker stop的时候会给容器内PID为1的进程发送这个signal,通过--stop-signal可以设置自己需要的signal,主要的目的是为了让容器内的应用程序在接收到signal之后可以先做一些事情,实现容器的平滑退出,如果不做任何处理,容器将在一段时间之后强制退出,会造成业务的强制中断,这个时间默认是10s

Syntax

    STOPSIGNAL signal

 

ARG

   ARG指令用以定义构建镜像时需要的参数

Syntax   

    ARG a_name
    ARG a_nother_name=a_default_value

    在docker build命令中以--build-arg a_name=a_value形式赋值

 

ONBUILD 

    ONBUILD指令可以为镜像添加触发器。其参数是任意一个Dockerfile 指令

    当我们在一个Dockerfile文件中加上ONBUILD指令,该指令对利用该Dockerfile构建镜像(比如为A镜像)不会产生实质性影响。但是当我们编写一个新的Dockerfile文件来基于A镜像构建一个镜像(比如为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令。需要注意的是,如果是再利用B镜像构造新的镜像时,那个ONBUILD指令就无效了,也就是说只能再构建子镜像中执行,对孙子镜像构建无效。

示例:

FROM ubuntu
MAINTAINER hello
ONBUILD RUN mkdir mydir

 

 

 

<think>嗯,用户想了解Dockerfile指令的详解和用法示例。首先,我需要回忆一下常见的Dockerfile指令有哪些。比如FROM、RUN、COPY、ADD、CMD这些基础指令,还有像WORKDIR、ENV、EXPOSE、VOLUME、ARG、LABEL这些进阶指令。每个指令的作用和区别是什么,得一一理清楚。 然后,用户可能对每个指令的具体用法和示例感兴趣。比如,FROM用来指定基础镜像,RUN用来执行命令,COPY和ADD的区别是什么?记得ADD可以自动解压和从URL下载,但一般推荐用COPY,除非需要那些额外功能。CMD和ENTRYPOINT的区别也是一个重点,CMD设置默认命令,可以被覆盖,而ENTRYPOINT是入口点,通常结合使用。 接下来,用户可能需要实际的例子来理解这些指令。比如WORKDIR设置工作目录,可以避免多次使用cd命令。ENV设置环境变量,方便后续指令引用。EXPOSE声明端口,但实际映射需要在运行时指定。VOLUME创建挂载点,ARG构建时的变量,LABEL添加元数据。 还要注意用户提供的引用内容,里面有提到构建命令docker build -t [images]:[tag] [dockerfile path],以及工作目录的设置。需要确保在回答中提到这些引用中的例子,并正确标注引用标记。比如WORKDIR的例子来自引用3,构建命令来自引用1。 用户可能还想知道最佳实践,比如为什么推荐使用COPY而不是ADD,如何分层优化镜像大小,多阶段构建的好处。这些内容能帮助用户写出更高效的Dockerfile。同时,常见问题部分可以解答他们在使用中可能遇到的困惑,比如指令执行顺序,CMD和ENTRYPOINT的优先级。 最后,生成相关问题时要围绕用户可能深入询问的点,比如指令执行顺序、多阶段构建、优化方法、环境变量设置等。确保问题有针对性,能引导用户进一步学习。</think>### Dockerfile指令详解及用法示例 --- #### 一、基础指令 1. **FROM** 指定基础镜像,所有Dockerfile必须以`FROM`开头。 ```dockerfile FROM ubuntu:20.04 # 使用Ubuntu 20.04作为基础镜像 ``` 2. **RUN** 执行命令并创建新的镜像层,常用于安装软件包。 ```dockerfile RUN apt-get update && apt-get install -y nginx # 更新并安装nginx[^2] ``` 3. **COPY** 将本地文件复制到镜像中,需明确指定路径。 ```dockerfile COPY ./app /usr/src/app # 复制本地app目录到镜像的/usr/src/app ``` 4. **ADD** 类似`COPY`,但支持自动解压压缩文件或从URL下载资源。 ```dockerfile ADD https://example.com/file.tar.gz /opt # 下载并解压文件到/opt ``` 5. **CMD** 设置容器启动时的默认命令(可被`docker run`覆盖)。 ```dockerfile CMD ["nginx", "-g", "daemon off;"] # 启动nginx服务 ``` --- #### 二、进阶指令 1. **WORKDIR** 设置后续命令的工作目录,类似`cd`命令。 ```dockerfile WORKDIR /app # 后续命令在/app目录下执行[^3] ``` 2. **ENV** 设置环境变量,可被后续指令或容器运行时使用。 ```dockerfile ENV NODE_ENV=production # 定义环境变量 ``` 3. **EXPOSE** 声明容器运行时监听的端口(需通过`-p`映射实际端口)。 ```dockerfile EXPOSE 80 # 声明容器使用80端口 ``` 4. **VOLUME** 创建匿名数据卷,用于持久化数据。 ```dockerfile VOLUME /var/log # 挂载日志目录 ``` 5. **ARG** 定义构建时的变量(仅在构建阶段有效)。 ```dockerfile ARG APP_VERSION=1.0 COPY app-$APP_VERSION.tar.gz /app ``` 6. **LABEL** 为镜像添加元数据(如维护者信息)。 ```dockerfile LABEL maintainer="dev@example.com" ``` --- #### 三、最佳实践 1. **分层优化** - 合并多个`RUN`指令减少镜像层数 ```dockerfile RUN apt-get update && \ apt-get install -y git curl ``` 2. **多阶段构建** ```dockerfile # 构建阶段 FROM golang:1.18 AS builder COPY . . RUN go build -o /app # 最终阶段 FROM alpine:latest COPY --from=builder /app /app CMD ["/app"] ``` 3. **清理缓存** ```dockerfile RUN apt-get update && apt-get install -y \ package1 \ package2 \ && rm -rf /var/lib/apt/lists/* ``` --- #### 四、构建镜像示例 ```bash # 根据Dockerfile构建镜像 docker build -t myapp:v1 . # 使用当前目录的Dockerfile[^1] ``` --- #### 五、常见问题 1. **COPY与ADD的区别** - `ADD`支持自动解压和URL下载,但推荐优先使用`COPY`保持行为明确。 2. **CMD与ENTRYPOINT的关系** - `ENTRYPOINT`定义容器入口,`CMD`提供默认参数,组合使用可实现灵活的命令覆盖。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值