上文中我们编写了一个Dockerfile的一个小示例,并且成功使用Dockerfile构建了一个镜像,并成功的执行了。接下来,我们来学习Dockerfile的基本编写语法。
一:FROM语法和镜像的选择
1:说到选择镜像,请遵循以下三个原则:
1) 官方镜像优于非官方的镜像;
2) 固定版本的Tag,而不是每次都使用latest:
3) 功能满足,选择体积小的镜像:
2:from语法
From命令其实很简单,就是使用哪个镜像来构建容器。但是呢,他也很复杂,下面我们来了解一下使用的注意项
(1):FROM指令开始一个新的构建阶段,设置后续构建依赖的基础镜像,Dockerfile必须以FROM开始。镜像可以是任意有效镜像。示例:在nginx:latest镜像基础上,直接创建一个新的镜像。
FROM nginx
CMD /bin/bash
(2):Dockerfile必须以FROM指令开始(除ARG指令之外),否则会出现"Please provide a source image with from prior to commit"。
CMD echo "Before FROM"
FROM nginx
CMD /bin/bash
这么写是会报错的。
(3):FROM可以在一个Dockerfile中出现多次,以创建多个镜像或者将当前构建作为另一个构建的依赖。
(4):通过向FROM指令添加AS name,可以选择为新生成阶段指定名称。该名称可以在后续的FROM和COPY --FROM=指令中使用,以引用在此阶段中构建的镜像。
FROM nginx AS firstNginx
CMD /bin/bash
(5):tag或者digest的值是可选的。如果省略其中任何一个,则默认情况下,构建器使用latest作为默认值。如果找不到tag的值,则构建器返回错误。
FROM nginx:109
CMD /bin/bash
不存在109版本的nginx,下载出现错误
(6):--platform可以用于指定镜像的平台,用来处理那些支持多平台的镜像。例如:linux/amd64、linux/arm64或windows/amd64。默认情况下,使用生产请求的平台。全局生成参数可用于此标志的值,例如:自动平台参数允许您强制一个阶段到本机构建平台(--platform=$BUILDPLATFORM),并使用它交叉编译到阶段内部的目标平台。
FROM --platform=linux/arm64 nginx
CMD /bin/bash
nginx:latest作为基础镜像,指定--platform=linux/arm64进行镜像构建。
二:RUN执行指令使用技巧
RUN命令用于执行后面跟着的命令行命令。有以下两种格式:
注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。
FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。
FROM centos
RUN yum -y install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。
注意:在shell编程中,若是使用""执行命令的时候,不管前边命令执行与否都会执行后边的。"&&"则不是这样的,若是前边命令执行失败,后边的命令就不会执行了。
以上大概就是Dockerfile中RUN以及FROM语法的基本使用。
有好的建议,请在下方输入你的评论。