1. FROM的作用
FROM的作用是定义基础镜像(baseimage),表示当前容器是基于哪个基础镜像构建新的镜像。例如:Centos、Ubuntu等。定义的格式如下:
FROM 基础镜像名
注意:如果是制作基础镜像(base image)可以直接写 scratch 。一般我们都是在某个基础镜像上镜像制作新镜像。
如果只写镜像名,默认为最新版本,例如 FROM ubuntu 。也可以指定基础镜像版本号。例如:FROM ubuntu:20.04 或者 FROM centos:7
2. LABEL的作用
label的作用主要描述镜像的作者、版本号及简介信息等。
LABEL maintainer="作者的名称"
LABEL version="1.0"
LABEL description="简介"
3. RUN的作用
run的作用是打包镜像时运行系统命令。例如 apt-get update && apt-get install -y vim 等。一般都是给镜像安装一些软件包。由于是打包镜像时执行,所以run只会执行一次。
由于每一次run都会制作一个分成,因此建议大家把多个run命令合并为一个。如果安装的命令比较多,可以使用 \ 换行,具体表现如下:
RUN apt-get update && apt-get install -y vim && \
rm -rf /var/lib/apt/lists/*
4. WORKDIR
workdir的作用是定义工作目录,它的实际作用类似于 cd 命令,但是如果workdir的目录不存在,会自动创建目录。例如下方案例:
WORKDIR /app
WORKDIR blog
RUN PWD
上面的命令打印结构为 /app/blog , 最后实际的工作目录为 /app/blog 目录。如果blog不存在,会自动创建blog目录
RUN命令执行cd操作也可进入某个目录,但是不推荐大家使用RUN来定义实际的工作目录
workdir尽量使用绝对路径不要使用相对路径,相对路径容易出错
5. CMD
cmd和run的作用都是执行命令和参数,但是cmd是容器启动时执行的命令和参数,并且定义了多个cmd时只有最后一个cmd才会执行。此外,如果 docker run 运行容器时指定了其他执行的命令,cmd相关命令会直接忽略。cmd的格式和run一样,具体格式如下:
FROM ubuntu
RUN apt-get update && apt-get install -y vim && \
rm -rf /var/lib/apt/lists/*
CMD echo 'hello' && bash /app/test.sh
上述dockerfile文件打包的镜像,如果使用【docker run 镜像名】命令运行容器时会执行一次CMD相关命令。但是如果使用【docker run -it 镜像名 /bin/bash】以交互方式运行容器时会忽略CMD的命令
6. ENTRYPOINT
entrypoint和上面的run以及cmd一样都是执行命令和参数,区别于entrypoint是让容器以应用程序或者服务的形式运行,并且entrypoint一定会执行不会被忽略。entrypoint一般用于启动容器中的某个应用程序。格式如下所示:
FROM ubuntu
ENTRYPOINT /app/start.sh
/app/start.sh:为某个应用启动的脚本。关于脚本可以使用下方的COPY或者ADD命令将本地的脚本复制到镜像中
7. ADD 和 COPY
ADD和COPY的作用都是将本地的文件添加到docker镜像中。两者之间最大的区别就是:ADD除了copy功能之外还自带解压缩的功能。例如:ADD 一个压缩包到镜像中时,会自动解压缩到指定的目录中。具体格式如下:
ADD nginx.conf /usr/local/nginx/nginx.conf
ADD test.tar.gz /
COPY test.py /app
这两个命令还可以结合 WORKDIR 使用。这样可以节省根目录的定义。具体格式如下:
WORKDIR /app
ADD test.py test/
结合workdir后,最终test.py实际目录为:/app/test/test.py
8. ENV
env的作用是定义常量,其他命令可以通过 ${} 的形式使用常量。这样可以增加dockerfile的可维护性
ENV MYSQL_VERSION 5.6
RUN apt-get update && apt-get install -y vim && \
rm -rf /var/lib/apt/lists/* && apt-get install -y mysql-server="${MYSQL_VERSION}"
领取专属 10元无门槛券
私享最新 技术干货