第五章:Dockerfile
[TOC]
常见关键词
FROM:在Dockerfile中第一条非注释INSTRUCTION一定是FROM,它决定了以哪一个镜像作为基准,首选本地是否存在,如果不存在则会从公共仓库下载(当然也可以使用私有仓库的格式)。
MAINTAINER :使用MAINTAINER指令来为生成的镜像署名作者
LABEL:指定label,设置之后,使用docker inspect来查看
[root@host mysql]# docker inspect mysql |sed -n '/Labels/,/}/p' "Labels": { "build-date": "2019-03-15", "image": "mysql-5.7", "org.label-schema.build-date": "20181205", "org.label-schema.license": "GPLv2", "org.label-schema.name": "CentOS Base Image", "org.label-schema.schema-version": "1.0", "org.label-schema.vendor": "CentOS", "vendor": "fangdm" }WORKDIR:WORKDIR指令用于设置Dockerfile中的RUN、CMD和ENTRYPOINT指令执行命令的工作目录(默认为/目录)。
USER:和 WORKDIR 一样,USER 只是帮助你切换到指定用户而已,这个用户必须是事先建立好的,否则无法切换。
VOLUME:定义匿名卷。为了防止运行时用户忘记将动态文件所保存目录挂载为卷,在 Dockerfile 中,我们可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其应用也可以正常运行,不会向容器存储层写入大量数据。
COPY:复制文件
ADD:比COPY更高级,会自动下载或者自动解压,如果 <源路径> 为一个 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,ADD 指令将会自动解压缩这个压缩文件到 <目标路径> 去。
ENV 设置环境变量,也是可以使用docker inspect查的。当然进入系统之后,使用env命令也是可以输出的。
[root@host mysql]# docker inspect mysql |sed -n '/"Env"/,/]/p' "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", "REPO_URL=https://repo.mysql.com//mysql57-community-release-el7-11.noarch.rpm", "MYSQL_ROOT_PASSWORD=**Random**", "MYSQL_VERSION=5.7", "MYSQL_USER=mysql", "MYSQL_GROUP=mysql"ARG 构建参数:和 ENV 的效果一样,都是设置环境变量。所不同的是,ARG 所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。
RUN:在当前镜像的顶层执行任何命令,并commit成新的(中间)镜像。第一种为shell格式,exec格式,不会触发shell,所以$HOME这样的环境变量无法使用。
RUN <commnad> 或 RUN ["executable", "param1", "param2"]ENTRYPOINT:设置在容器启动时执行命令,如果有多个ENTRYPOINT指令,那只有最后一个生效。
CMD指令的主要功能是在build完成后,为了给docker run启动到容器时提供默认命令或参数,这些默认值可以包含可执行的命令,也可以只是参数(此时可执行命令就必须提前在ENTRYPOINT中指定)。它与ENTRYPOINT的功能极为相似,区别在于如果docker run后面出现与CMD指定的相同命令,那么CMD会被覆盖;而ENTRYPOINT会把容器名后面的所有内容都当成参数传递给其指定的命令(不会对命令覆盖)。另外CMD还可以单独作为ENTRYPOINT的所接命令的可选参数。
EXPOSE:指令告诉容器在运行时要监听的端口,但是这个端口是用于多个容器之间通信用的(links),外面的host是访问不到的。要把端口暴露给外面的主机,在启动容器时使用-p选项。
.dockerignore:这个文件用来忽略上下文目录中包含的一些image用不到的文件,它们不会传送到docker daemon。
Last updated
Was this helpful?