什么是 Dockerfile?
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
先看一个例子
登录hub.docker.com,搜索centos,找到centos7.9
FROM scratch
ADD centos-7-x86_64-docker.tar.xz /
LABEL
org.label-schema.schema-version="1.0"
org.label-schema.name="CentOS Base Image"
org.label-schema.vendor="CentOS"
org.label-schema.license="GPLv2"
org.label-schema.build-date="20201113"
org.opencontainers.image.title="CentOS Base Image"
org.opencontainers.image.vendor="CentOS"
org.opencontainers.image.licenses="GPL-2.0-only"
org.opencontainers.image.created="2020-11-13 00:00:00+00:00"
CMD ["/bin/bash"]
上面红色大写字母就是dockerfile的指令,后面跟随相对应的参数,当docker根据dockerfile构建镜像的时候,会逐行执行这些指令,每条指令都会创建一个新的镜像层,最后生成我们想要的镜像。
注:scratch是初始镜像,可理解为c#中的基类。
构建命令
docker build -f ./dockerfile -t myImageName .
-f dockerfile文件的路径,如果是在当前目录下,可省略
-t 要生成的镜像的名字,可跟 :版本号,自定义镜像版本
. 上下文路径,在构建镜像时可能要用到本机文件,会将路径下的所有内容打包。如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。
Dockerfile常用指令
FROM
定制的镜像都是基于 FROM 的镜像,例如 FROM centos,若本地没有这个镜像会自动下载该镜像到本地。
RUN
在docker build时执行的命令,有两种格式:
①shell格式,等同在shell终端操作的命令
RUN yum install vim -y
②exec格式
RUN ["yum","install","vim","-y"]
MAINTAINER
镜像维护者的姓名和邮箱地址
EXPOSE
当前容器对外暴露的端口号
WORKDIR
进入容器后所在的目录位置,如 WORKDIR /usr/local
ENV
在构建镜像过程中设置环境变量,
格式ENV <key> <value>或ENV <key1>=<value> <key2>=<value> 如 ENV version 1.0
使用就是 $version
COPY
从上下文目录中复制文件或者目录到容器指定路径
COPY [--chown=<user>:<group>] <源路径1>... <目标路径>
[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。
COPY hom* /mydir 代表将上下文目录下的hom*文件复制到容器中的/mydir目录下
ADD
与COPY类似,但会自动解压tar文件以及处理URL
VOLUME
容器数据卷,格式 VOLUME ["路径1","路径2","路径3"]
CMD
在docker run时运行的命令,并且仅最后一个生效,格式:
CMD <shell 命令>
CMD ["可自行的命令或文件","参数1","参数2"...]
ENTRYPOINT
与CMD类似,但可以追加参数,两种方式:
ENTRYPOINT yum install vim
①在运行容器时后面添加命令参数
docker run -it mycentos -y
②在dockerfile中追加参数
ENTRYPOINT yum install vim #定参
CMD ["-y"] #变参
ONBUILD
延迟构建的命令,即在本次构建的镜像过程中不会执行,当有其他dockerfile继承自该镜像时,会触发ONBUILD后面的命令。