[docker专题-02] Dockerfile自动化构建镜像
构建入门
-
Dockerfile
是一个包含用于组合映像的命令的文本文档,是自动化构建的基础,Dockerfile
文件所在的文件夹被成为构建上下文。 -
Dockerfile
一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。#注释以#开头表示,中间的#不表示注释 #除注释外 第一条指令必须是FROM 用来指定基础镜像 FROM ubuntu:latest #LABEL标签指定镜像的元数据:如维护者信息等 LABEL maintainer="yuanjianfeng@qq.com" #替换基础镜像中的源镜像设置 更改为上下文中sources.list定义的阿里镜像源 ADD sources.list /etc/apt/sources.list #运行命令更新以及安装git RUN ["apt-get", "update"] RUN ["apt", "install", "-y", "git"]
-
docker build
命令用于从Dockerfile构建映像,可以在docker build
命令中使用-t
标志指定生成镜像的tag标记。
~ docker-git sudo docker build -t docker-git:v1 .
### Dockerfile中的常用指令
- `FROM`指令,必须为第一个指令,指定基础镜像,使用格式如下:
```dockerfile
#FROM <image> FROM <image>:<tag> 使用基础镜像时未指定tag时使用的是latest
FROM ubuntu
#FROM redis:4.0.14
-
LABEL
指令,指定镜像元数据,用来替换废弃的MAINTAINER
指令,使用一对键值对来指定该信息即可,考虑到镜像创建时层的因素,建议把所有的Label放在一个指令中,使用格式如下:# LABEL <key>=<value> <key>=<value> <key>=<value> ... LABEL maintainer="yuanJacky" email="93775@qq.com"
-
ENV
指令,用来指定环境变量,后续的指令可以使用该环境变量以及RUN运行容器时可通过-e
参数来重新指定环境变量,使用格式如下:# ENV <KEY> <VALUE> 设置单个环境变量 # ENV <KEY>=<VALUE> <KEY>=<VALUE> ... 设置多个环境变量 FROM ubuntu RUN mkdir -p /opt/jdk8 ENV JDK_PATH /opt/jdk8 RUN echo "PATH=$JDK_PATH/bin:PATH" >> /etc/profile
-
ADD和COPY
指令:两者都有把构建上下文下的文件或者子目录下的文件和目录拷贝到镜像中的功能,不同点是ADD指令能把zip/gz
等文件自动解压缩,通用使用格式如下:# ADD [--chown=<user>:<group>] <src>... <dest> # ADD [--chown=<user>:<group>] ["<src>",... "<dest>"] 目录中有空格 且dest以/结尾 则认定为目录,否则为表示文件,目标文件或者目录不存在时会自动创建 权限755 FROM ubuntu #目标不以/结尾 表示文件 镜像构建过程中会把sources.list拷贝到镜像中的/etc/apt/sources.list ADD sources.list /etc/apt/sources.list #目的地址以/结尾,文件会被拷贝到/opt目录下 文件名未改 COPY sources.list /opt/ #ADD指令会解压文件到当前复制的目的目录,解压的文件名为redis-4.0.11 ADD redis-4.0.11.tar.gz /opt/
-
RUN
指令,在当前镜像中运行指定的命令,默认情况下,RUN指令会在shell里使用/bin/sh -c
来包装该命令,也可以使用类似数组的方式来运行命令,使用如下:# RUN /bin/sh -c 'apt update' # RUN apt update # RUN ["apt", "update"] # RUN指令多条命令在一条指令中 使用&&包含多条命令 并支持\行分隔符 RUN apt update && apt install -y nginx
-
CMD和ENTRYPOINT
指令,主要用于容器运行时指定运行的命令,单两者存在区别,主要使用如下:#1 cmd给出的是一个容器的默认可执行体,容器启动后默认执行的命令,存在以下三种用法: #1.1 CMD command param1 param2 #实际执行/bin/sh -c 的方式执行 #1.2 CMD ["executable","param1","param2"] #可执行文件方式执行 这两种方式下如果在运行容器中指定了另外的运行命令,则CMD中的运行命令会被覆盖。只能有一个cmd 存在多个时最后一个生效。 FROM redis-single:v4 CMD ["redis-server"] #2 entrypoint指定程序的入口点,当同时存在cmd时,cmd中只能为第二种形式,且cmd中的子串会变成参数。由以下两种方式: #2.1 CMD ["executable","param1","param2"] shell方式下执行 容器run后面以及cmd中都将成为参数。 FROM redis-single:v4 ENTRYPOINT ["redis-server"]
-
EXPOSE
指令,用来指示容器运行时监听指定的端口和协议,使用格式如下:# EXPOSE <port> EXPOSE <port>/<prototol> 未指定协议时默认为tcp EXPOSE 80 EXPOSE 80/tcp #等同EXPOSE 80
-
VOLUME
指令,用来指定特定的挂载点,在容器运行时可通过-v
参数来指定宿主机的挂载目录。VOLUME ["/data"]
-
WORKDIR
指令,用来指定工作目录,如先前指定,则后续的RUN
,CMD
,COPY/ADD
指令都会以该指定目录执行相关的命令。使用格式如下:WORKDIR /path/to/worker