Dockerfile是一个文本格式的配置文件,用户可以使用dockerfile来快速创建自定义镜像。指令包括“配置指令”、“操作指令”。
配置指令
FROM
FROM debian:jessie
dockerfile的第一行指令,指定基础镜像
ARG
ARG VERSION=9.3
定义创建镜像过程中的临时变量,相当于dockerfile运行中的临时变量
LABEL
LABEL version="1.1.1.1"
为生成的镜像添加元数据标签信息,方便过滤
EXPOSE
EXPOSS 22 80 443
声明镜像内服务监听端口,如果需要映射出来,启动容器时使用-p hostport:container_port
参数映射指定端口。
ENV
ENV APP_VERSION=1.0.0
指定环境变量,方便给后续RUN
使用,可以被docker启动时指定的--env给覆盖
ENTRYPOINT
ENTRYPOINT ["tail"]
指定默认入口命令,作为启动容器时候的根命令执行,每个dockerfile中只有一个ENTRYPOINT,运行时可以被--entrypoint参数覆盖,与CMD
参数的区别,在“操作指令CMD中说明”
VOLUME
VOLUME ["/data"]
挂载数据卷
USER
USER daemon
指定运行容器时的用户名或UID,后续的RUN指令也会使用该用户身份,也可创建一个用户RUN groupadd -r postgres && useradd --no-log--init -r -g postgres postgres
需要获取管理员权限使用gosu
命令
WORKDIR
WORKDIR /app
为后续的RUN,CMD,ENTRYPOINT指令配置工作目录
ONBUILD
ONBUILD RUN /python-build --dir /user/app
在dockerfile中指定该参数,当子dockerfile使用该dockerfile创建出来的镜像为基础镜像时,会先执行该命令。优先用于创建自动编译,检查基础镜像时使用
STOPSIGNAL
STOPSIGNAL signal
指定创建镜像启动的容器接收退出的信号值
HEALTHCHECK
HEALTHCHECK NONE
:不进行健康检查HEALTHCHECK CMD command
:根据使用命令返回值是否为0,为0则健康,默认30s检查一次,等待结果30s超时,重试3次。如果不健康,会在 STATUS中显示unhealthy
SHELL
SHELL ["/bin/sh","-c"]
指定其他命令使用shell时的shell类型,windows系统的分隔符不一致,在dockerfile的开头中使用#escape='
来转译
操作指令
RUN
RUN apt-get update
RUN ["/bin/bash","-c","apt-get update"]
运行指定指令,每次运行基于上一次运行的基础镜像生成新的镜像层
CMD
CMD ["python","run.py"]
或CMD python run.py
指定启动容器时默认执行的命令,当时用ENTRYPOINT
参数时,CMD
的参数会作为默认参数传入ENTRYPOINT
,如:CMD [“tail”,"-f","/usr/aaa"]
ENTRYPOINT ["tail"]
凭借拼接为tailf tailf -f /usr/aaa
,显然这个命令会有异常,需要注意合理使用。
COPY
COPY . /app
复制当前目录下所有文件到/app目录,基础镜像没有这个目录会创建出来
ADD
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
COPY的高级命令。
如果<源路径>
为一个tar
压缩文件的话,压缩格式为gzip
,bzip2
以及xz
的情况下,ADD
指令将会自动解压缩这个压缩文件到<目标路径>
去,如果不为压缩文件,则与COPY
一致,如果需要压缩文件拷贝进去,则需要使用COPY
命令
多阶段构建
#构建第一段,创建编译环境
FROM golang:1.8-alpine as builder
RUN apk --no-cache add git
WORKDIR /go/src/github/go/HelloWorld/
RUN go get -d -v github/go-sql-driver/mysql
COPY app.go .
#编译环境
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
#构建第二段,运行环境镜像
FROM alpine:latest as prog
RUN apk --no-cache add ca-certificates
WORKDIR /root/
#--from=0从编译环境容器中将编译好的二进制文件拷贝到当前目录
#COPY --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf,也可拷贝其他镜像中的文件
COPY --from=0 /go/src/github/go/Helloworld/app .
CMD ["./app"]
.dockerignore文件
.idea
__pycache__
itchat.pkl
QR.png
制作镜像时不将这些文件传入镜像,减少镜像体积,加快制作过程。
dockerfile经验
尽量合并ADD RUN COPY
等命令,减少惊喜那个层数,恰当多步骤创建,精简基础镜像,使用.dockerignore文件,减少外部源的干扰。
来源:oschina
链接:https://my.oschina.net/u/4427008/blog/3163730