Dockerfile
Dockerfile是一个文本文件,其内包含一系列指令,用于构建镜像,每条指定对应一层镜像;
Dockerfile的格式:
- 以
#
开头的注释行 - 以专用指令开头的指令行
镜像构建原理
docker镜像构建命令格式为:
docker build [选项] <上下文资源/URL>
# 范例
## demo为镜像名
## v1为标签名
## . 上下文路径
docker build -t demo:v1 .
Dockerfile常用指令
指令名 | 指令功能说明 |
---|---|
FROM | 指定新建镜像时使用的基础镜像,通常为Dockerfile的第一个指令,其前可出现ARG指令 |
LABEL | 附加到镜像上的元数据信息,以键值对存在 |
ENV | 以键值对形式配置环境变量,可被其后指令使用,并可在生成的容器中使用 |
RUN | 以FROM中定义的镜像为基础环境,运行指令并生成一个新的镜像层,并可由后续指令使用 |
CMD | 基于该Dockerfile生成的镜像生成容器时,CMD可指定容器默认运行的程序,因此仅需定义一次,默认为bash |
ENTRYPOINT | 类似于CMD指令的功能,但不能被CMD指定的默认运行程序覆盖,与CMD共存时,CMD内容将作为ENTRYPOINT定义程序的参数 |
WORKDIR | 为其他指定设定默认工作目录 |
COPY | 复制主机上或上一层镜像生成的文件或目录并生成新的镜像层 |
ADD | 与COPY功能类似,可额外支持URL作为源文件 |
VOLUMN | 指定基于镜像生成的容器运行时,期望作为VOLUMN使用的目录 |
EXPOSE | 指定基于镜像生成的容器运行时,期望暴露的端口,但实际是否暴露由容器启动命令来决定 |
USER | 为Dockerfile中该指令之后所有指令指定运行的用户uid及可选的gid |
ARG | 专门用于Dockerfile运行过程中的变量,但仅对其后指定有效,支持build时动态传入 |
ONBUILD | 触发器,生效于由该Dockerfile生成的镜像被用于其他镜像的from来源时 |
SHELL | 定义容器运行时默认的SHELL程序,Linux默认为[“/bin/sh”,”-c”],Windows默认为[“cmd”,”/S”,”/C”] |
RUN
构建镜像时需要执行的命令,有以下两种执行方式:
- shell方式:
# 格式 RUN <command> RUN echo "hello"
- exec方式:
# 格式 RUN ["executeable","param1","param2"] RUN ["/bin/bash","start.sh","sshd"]
ADD
将资源添加到容器中,tar类型文件添加进容器中会自动解压(通过网络下载的tar资源不会解压),可访问网络,类似wget
;
ADD指令支持模糊匹配,相对路径及绝对路径;
# 格式: ADD <SRC> ... <DEST>
FAQ
Q1:CentOS镜像启动服务时报错提示Failed to get D-Bus connection: Operation not permitted
A1:镜像启动时需使用指定语句并授予权限:docker run -d --name centos7 --privileged=true centos:7 /usr/sbin/init
Q2:CentOS8 yum地址无法解析 Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
A2:sed -i -e "s|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g" /etc/yum.repos.d/CentOS-*