Docker镜像制作


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-*


文章作者: Semon
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Semon !
评论
  目录