Dockerfile命令详解之 RUN(一)

        许多同学不知道Dockerfile应该如何写,不清楚Dockerfile中的指令分别有什么意义,能达到什么样的目的,接下来我将在容器化专栏中详细的为大家解释每一个指令的含义以及用法。
专栏订阅传送门https://blog.csdn.net/qq_38220908/category_11989778.html

        指令不区分大小写。但是,按照惯例,它们应该是大写的,以便更容易地将它们与参数区分开来。(引用至官方文档>>>

语法

#  该命令以shell形式运行,Linux默认为/bin/sh -c, Windows默认为cmd /S /C
RUN <command>

 或者

# exec格式,由于exec格式会被解析成为json数组,所以,必须使用双引号
RUN ["executable", "param1", "param2"]

        使用RUN指令都会在当前镜像最顶层生成新的层,并提交到执行结果。Dockerfile中的后续步骤可以使用提交的结果。由于每次使用RUN指令都会生成新的层,所以建议多个Shell在同一个RUN指令中声明。例如:

Dockerfile

FROM alpine

# 由于RUN指令在liunx平台上默认以shell命令执行,所以可以省略/bin/sh -c
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN apk add --no-cache  tini tzdata ttf-dejavu fontconfig

        两个RUN指令会生成两个新层 (RootFS中显示由三个层级是因为其中有一个层级FROM引入的基础层)

ade5df802d1c4371892b28713b35a1e7.png

070158f5fcf142f085de93fd9fe31f0d.png

          再次构建的时候,就会直接从cache中获取

6011f509f13b486ebd22b5acbc23c9d7.png

         由于每次使用ADD、COPY、RUN指令都会生成新的层,会导致层数过多,镜像文件增大,所以上面的RUN指令,我们可以合并为一条,其中 \ 为换行符,多个shell命令之间用 && 连接

FROM alpine

# 由于RUN指令在liunx平台上默认以shell命令执行,所以可以省略/bin/sh -c
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
&& apk add --no-cache  tini tzdata ttf-dejavu fontconfig

# 上面的语句等同于
RUN /bin/sh -c "sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
&& apk add --no-cache  tini tzdata ttf-dejavu fontconfig"

 这样我们可以看到总层数由原来的三层变为了两层

d2103ff541494c35aed6ceacefdb3542.png

f62257866c65483abd24bbdb9d8b9673.png

         如果我们使用第二种命令格式,上面的Dockerfile我们可以写成:

FROM alpine
RUN ["/bin/sh","-c","sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
&& apk add --no-cache  tini tzdata ttf-dejavu fontconfig"]

        如果容器是以windows平台作为基础镜像,我们可以使用第二种命令格式,执行exe文件。

# 由于exec命令方式最终会解析成json格式,所以我们要将反斜杠转义
# 在windows的路径中经常出现反斜杠,这时候我们需要使用双反斜杠进行转义,否则可能出现意料之外的问题
RUN ["c:\\windows\\system32\\tasklist.exe"]

 

 

 

[1]  感谢大佬 @kenllf 的斧正

 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dockerfile 是用于构建 Docker 镜像的一种文本文件。它包含了一系列的指令,用于描述构建镜像的步骤和配置。 下面是 Dockerfile 的一些常见指令和解释: 1. FROM:指定基础镜像,用于构建当前镜像。例如,可以使用 `FROM ubuntu:latest` 表示基于最新版本的 Ubuntu 镜像构建。 2. RUN:在镜像中执行命令。可以使用多个 RUN 指令来执行多个命令,每个 RUN 指令都会在前一个指令的基础上创建新的镜像层。 3. COPY:将文件或目录从主机复制到镜像中。可以使用 `COPY <src> <dest>` 来指定源文件/目录和目标路径。 4. ADD:类似于 COPY,但功能更强大。它可以复制远程文件、解压缩文件等。尽量使用 COPY 来避免不必要的复杂性。 5. WORKDIR:设置工作目录,后续的命令都会在该目录下执行。可以使用 `WORKDIR /path/to/directory` 来指定工作目录。 6. ENV:设置环境变量。可以使用 `ENV <key>=<value>` 来设置环境变量的键值对。 7. EXPOSE:声明容器运行时需要监听的端口。例如,可以使用 `EXPOSE 80` 来声明容器将监听 80 端口。 8. CMD:指定容器启动时要执行的命令。可以使用多个 CMD 指令,但只有最后一个生效。如果在运行容器时提供了命令,则 CMD 中的命令会被覆盖。 以上是一些常见的 Dockerfile 指令,还有其他指令如 ENTRYPOINT、LABEL 等,可根据具体需求进行使用。编写一个 Dockerfile 可以根据应用的需求进行定制化配置和设置,最终可以通过 Dockerfile 构建出一个可执行的 Docker 镜像。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值