docker基础 | Dockerfile创建自定义镜像

早过忘川 提交于 2020-02-27 13:57:48

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文件,减少外部源的干扰。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!