Dockerfile
Dockerfile是我们在项目中比较常用到的docker配置文件,我们把每一层定制的操作都封装成指令写入文件中,从而可以复用创建镜像的操作,增强可拓展性。
Dockerfile文件结构
Docker文件结构由以下4个部分组成:
基础镜像信息
维护者信息
镜像操作指令
容器启动时执行指令
支持#开头的注解
# This dockerfile uses the ubuntu image
# VERSION 18.04 - EDITION 1
# Author: docker_user
# Command format: Instruction [arguments / command] ..
ARG version=18.04
# 基础镜像信息
FROM ubuntu:${version}
# 维护者信息
MAINTAINER docker_user docker_user@email.com
# 镜像操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# 容器启动执行指令
CMD /usr/sbin/nginx
常见配置指令
1.ARG
定义创建镜像过程中使用的变量。
format: ARG [default value]
在执行docker build时,可以通过-build-arg[=]来为变量赋值。当镜像编译成功后,ARG指定的变量将不再存在(ENV指定的变量将在镜像中保留)
Docker内置镜像创建变量
HTTP_PROXY、HTTPS_PROXY、FTP_PROXY、NO_PROXY。
2.FROM
指定所创建镜像的基础镜像, Dockerfile的第一行指令一定是FROM开头。
如果在同一个Dockerfile中创建多个镜像时,可以使用多个FROM指令(每个镜像一次)。
format:
FROM image [AS name]
FROM image:tag [AS name]
FROM image@digest [AS name]。
Tips: 可以选用体积较小的镜像如Alpine或Debian作为基础镜像来保持镜像精简。
ARG version=18.04
# 基础镜像信息
FROM ubuntu:${version}
3. LABEL
LABEL指令可以为生成的镜像添加元数据标签信息,用于过滤特定镜像。
format: LABEL k:v ...
LABEL version=1.0 author=terry
4. EXPOSE
声明镜像内服务监听的端口。
format: EXPOSE port port/protocol\
该指令只是起到声明作用,并不会自动完成端口映射。如果要映射端口出来,在启动容器时可以使用-P参数(Docker主机会自动分配一个宿主机的临时端口)或-p HOST_PORT:CONTAINER_PORT参数(具体指定所映射的本地端口)。
EXPOSE 22 808443
5. ENV
指定环境变量,与ARG不同的是ENV制定的环境变量在镜像生成过程中会被后续RUN指令使用,在镜像启动的容器中也会存在。
format: ENV k=v
除了在Dockerfile中定义之外,还可以动态指定env进行覆盖
docker run --env key=value built_image。
**Tips: **当一条ENV指令中同时为多个环境变量赋值并且值也是从环境变量读取时,会为变量都赋值后再更新。
ENV k1=v2
ENV k1=v1 k2=${k1}
result:
k1 = v1 k2 = v2
6.ENTRYPOINT
指定镜像的默认入口命令,该入口命令会在启动容器时作为根命令执行,所有传入值作为该命令的参数,CMD的指定值将作为根命令的参数。\
每个Dockerfile中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。在运行时,可以被--entrypoint参数覆盖掉,如docker run --entrypoint。
format:
ENTRYPOINT ["executable", "param1","param2"]:exec调用执行;
ENTRYPOINT command param1 param2:shell中执行。
7. VOLUME
创建一个数据卷挂载点, 运行容器时可以从本地主机或其他容器挂载数据卷,一般用来存放数据库和需要保持的数据等。
format: VOLUME ["/data"]
8. USER
指定运行容器时的用户名或UID,后续的RUN等指令也会使用指定的用户身份。
format: USER user
当服务不需要管理员权限时,可以通过该命令指定运行用户(比如使用特定user启动elasticsearch),并且可以在Dockerfile中创建所需要的用户。例如:
9. WORKDIR
为后续的RUN、CMD、ENTRYPOINT指令配置工作目录。
format: WORKDIR /path/to/workdir
可以使用多个WORKDIR指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。
例如:如下命令执行后的最终路径为/a/b/c。因此,为了避免出错,推荐WORKDIR指令中只使用绝对路径。
WORKDIR /a
WORKDIR b
WORKDIR c
10. ONBUILD
指定当基于所生成镜像创建子镜像时,自动执行的操作指令。
format: ONBUILD [INSTRUCTION]。\
例如,使用如下的Dockerfile创建父镜像ParentImage,指定ONBUILD指令:
使用docker build命令创建子镜像ChildImage时(FROMParentImage),会首先执行ParentImage中配置的ONBUILD指令:
等价于在ChildImage的Dockerfile中添加了如下指令:
Tips: 由于ONBUILD指令是隐式执行的,推荐使用LABEL进行标注,例如ruby:2.1-onbuild。ONBUILD指令在创建专门用于自动编译、检查等操作的基础镜像时,十分有用。
11. STOPSIGNAL
指定所创建镜像启动的容器接收退出的信号值:
STOPSIGNAL signal
12. HEALTHCHECK
配置所启动容器如何进行健康检查(如何判断健康与否),自Docker 1.12开始支持。
类似定制的主动心跳检查。
format:
HEALTHCHECK [OPTIONS] CMD command:根据所执行命令返回值是否为0来判断;
HEALTHCHECK NONE:禁止基础镜像中的健康检查。
OPTION支持如下参数:
-interval=DURATION (default: 30s):过多久检查一次;
-timeout=DURATION (default: 30s):每次检查等待结果的超时
-retries=N (default: 3):如果失败了,重试几次才最终确定失败。
13. SHELL
指定其他命令使用shell时的默认shell类型:
SHELL ["executable", "parameters"]
默认值为["/bin/sh", "-c"]
Tips: 对于Windows系统,Shell路径中使用了“\”作为分隔符,建议在Dockerfile开头添加# escape=’来指定转义符。