08-Dockerfile创建镜像

使用Dockerfile创建镜像

docker是一个文本格式的配置文件,可以通过dockerfile来快速创建自定义的镜像。

基本结构

dockerfile由一行行命令语句组成,并且支持#开头的注释,dockerfile一般分为四个部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行的指令。
指令说明:
08-Dockerfile创建镜像

配置指令

1、ARG定义创建镜像过程中使用的变量。ARG <name>[=<default value>]在执行docker build时,可以通过-build-arg[=]来为变量赋值,当镜像编译成功后,ARG指定的变量将不存在。
docker内置了一些变量,可以直接使用无需声明:HTTP_PROXY HTTPS_PROXY FTP_PROXY NO_PROXY
2、FROM指定所创建镜像的基础镜像。FROM <image> [AS <name>]或FROM <image>:<tag> [AS <name>]或FROM <image>@<digest> [AS <name>]。任何Dockerfile中第一条指令必须为FROM指令。并且要在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令。
例:
ARG VERSION=9.3
FROM debian:${VERSION}
3、LABEL可以为生成的镜像添加元数据标签信息,这些信息可以用来辅助过滤出特定镜像。LABEL <key>=<value> <key>=<value> <key>=<value>
例:
LABEL version="1.0.0-rc3"
LABEL author="tcw@github" date="2020-01-01"
LABEL description="this test"
4、EXPOSE声明镜像内服务监听端口,EXPOSE <port> [<port>/<portcocol>],但只会起到声明作用,不会自动完成端口映射
例:
EXPOSE 22 80 8443
5、ENV指定环境变量,在镜像生成过程中会被后续RUN指令使用,在镜像启动的容器中也会存在,EVN <key> <value>或ENV <key>=<value>。当一条ENV为多个环境变量赋值时,会更新为后一个。
例:
ENV APP_VERSION=1.0.0
ENV APP_HOME=/usr/local/app
ENV PATH $PATH:/usr/local/bin
6、ENTRYPOINT镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有传入值作为该命令的参数,支持两种格式:
ENTRYPOINT ["executable","param1","param2"]: exec调用执行;
ENTRYPOINT command param1 param2: shell中执行。
此时,CMD指令指定值将作为根命令的参数,每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个生效,在运行时,可以被--entrypoint参数覆盖掉。
例:
docker run --entrypoint
7、VOLUME创建一个数据卷挂载点,VOLUME ["/data"]。运行容器时可以从本地主机或其他容器挂载数据卷,一般用来存放数据库和需要保持的数据等。
8、USER运行容器时的用户名或UID,后续的RUN等指令也是会用这个用户运行,USER daemon,可以用过该命令指定运行用户,并且可以在Dockerfile中创建所需要的用户。
例:
RUN groupadd -r postgres && useradd --no-log-init -r -g postgres postgres #可以使用gosu命令临时获取管理员权限
9、WORKDIR为RUN/CMD/ENTRYPOINT指令配置工作目录,WORKDIR /path。可以使用多个WORKDIR指令,后续命令如果是相对路径,则会基于之前命令指定的路径。
例:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
10、ONBUILD当基于所生成镜像创建子镜像时,自动执行的操作命令,ONBUILD [INSTRUCTION]
例:

#使用Dockerfile创建父镜像ParentImage,指定ONBUILD
# Dcokerfile for ParentImage
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
#使用docker build命令创建子镜像ChildImage时,会首先执行ParentImage中配置的ONBUILD指令
# Dockerfile for ChildImage
FROM ParentImage

等同于在ChildImage的dockerfile中添加了如下指令

#Automatically run the following when building ChildImage
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src

注:由于ONBUILD指令是隐式执行的,推荐在使用他的镜像标签中进行注释,ONBUILD指令在创建专门用于自动编译、检查等操作的基础镜像时十分有用
11、STOPSIGNAL指定所创建镜像启动的容器接收退出信号值
STOPSIGNAL signal
12、HEALTHCHECK配置所启动容器如何进行健康检查,有两种格式:
HEALTHCHECK [OPTIONS] CMD command #根据所执行命令返回值是否为0判断
OPTIONS参数:
-interval=DURATION 多久检查一次,默认30s
-timeout=DURATION 每次检查等待结果超时,默认30s
-retries=N 如果失败了,重复几次才确定失败了,默认3次
HEALTHCHECK NONE #禁止基础镜像中的健康检查
13、SHELL指定其他命令使用shell时默认shell类型
SHELL ["executable","parameters"] #默认为["bin/sh","-c"]

操作指令

1、RUN运行指定命令,RUN <COMMAND>或RUN ["executable","param1","param2"]
例:
RUN ["bin/bash", "-c", "echo hello"]
每条RUN指令将在当前镜像基础上执行指定命令,并提交为新的镜像层。

RUN apt-get update \
         && apt-get install -y libsnappy-dev zlib1g-dev libbz2-dev \
                 && rm -rf /var/cache/apt \
                 && rm -rf /var/lib/apt/lists/*

2、CMD用于指定启动容器时默认执行的命令。支持三种格式:
CMD ["executable","param1","param2"] #执行executable param1 param2
CMD command param1 param2 #在默认的shell中执行,提供给需要交互的应用
CMD ["param1","param2"] #提供给ENTRYPOINT的默认参数
每个Dockerfile只能有一个CMD命令。如果指定了多个命令,只有最后一个会被执行。
3、ADD添加内容到镜像ADD <src> <dest>。该命令将复制指定的<src>路径下内容到容器的<dest>路径下,其中<src>可以是Dockerfile所在目录的一个相对路径;也可以是一个URL;一个tar文件(自动解压为目录)
例:
ADD *.c /code
4、COPY复制内容到镜像,COPY <src> <dest>。复制本地主机的<src>下内容到镜像中的<dest>,目标路径不存在会自动创建

猜你喜欢

转载自blog.51cto.com/11923906/2480325