Dockerfile指令

在此整理Dockerfile常用指令

FROM:原始镜像(scratch空白镜像),在指定镜像上定制。

RUN:1)shell类型 :直接输入命令

           2)exec类型:RUN["可执行文件","param1","param2"]

    ps:多个RUN会在每个指令后commit这一层,通过 “\ (换行)&& ”接多个指令

COPY:1)shell:COPY <源路径>...<目标路径> ,源路径可以是多个也可以是通配符,这的路径指的都是上下文路径,而不是Dockcerfile文件相对路径或你的docker命令路径,如“docker build . ”此时指定了上下文路径就是"."

目标路径可以是容器内绝对路径,也可以是WORKDIR的相对路径

             2)exec。。。

ADD和COPY差不多,源路径可以用url,去url中下载的文件,tar会自动解压。

CMD:指定默认的容器主进程,主进程默认为/bin/bash

            1)shell:命令被包装成sh -c,主进程为sh

            2)exec

ENTRYPOINT:目的和CMD类似,指定容器启动程序和参数,其参数可以在运行时替代docker run --entrypoint

ENV:设置环境变量

            1)ENV<key><value>

            2)ENV<key1>=<value1> <key2>=<value2>

            ps:可用于ADD、COPY、ENV、EXPOSE、LABEL、USER、WORKDIR、VOLUME、STOPSIGNAL、ONBUILD

ARG:构建参数,设置的是构建环境的环境变量,在将来容器运行时不会存在。

            ARG<参数名>[=<默认值>],docker build --build-arg<参数名>=<参数值>

VOLUME:匿名卷,“VOLUME /data”容器运行时,向data中写入的信息不会进入容器存储层

EXPOSE:运行时容器提供的服务端口,-P <宿主端口>:<容器端口>,-P是映射宿主端口和容器端口,EXPOSE并不会自动在宿主进行端口映射,只是说打算使用哪些端口。

WORKDIR:改变当前工作目录,可以影响以后的层。

USER:改变身份,和WORKDIR类似

HEALTHCHECK:健康检查,

            1)HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况命令

            2)HEALTHCHECK NONE:屏蔽健康检查

            选项:

                    --interval=<间隔>:默认30秒

                    --timeout=<时长>:设置检查时间,超时就失败,默认30秒

                    --retries=<次数>:连续失败次数后,视为unhealthy,默认3次

ONBUILD:以当前镜像为基础镜像时,去构建下一级镜像的时候才会被执行。

                ONBUILD <其他指令>

<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、付费专栏及课程。

余额充值