DockerFile介绍
镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,那么之前提及的无法重复的问题、镜
像构建透明性的问题、体积的问题就都会解决。这个脚本就是Dockerfile。
Dockerfile是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每
一条指令的内容,就是描述该层应当如何构建。
Go的DockerFile
# FROM 基于 golang:1.20
FROM golang:1.20 AS builder
# ENV 设置环境变量
ENV GOPATH=/opt/repo
ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.cn,https://gocenter.io,https://goproxy.io,direct
ENV CGO_ENABLED=0
ENV GOOS=linux
WORKDIR $GOPATH/app
# COPY 源路径 目标路径
COPY . $GOPATH/app
# RUN 执行 go build .
RUN cd $GOPATH/app &&go build main.go
# FROM 基于 alpine:latest
FROM alpine:latest
# RUN 设置 Asia/Shanghai 时区
RUN apk --no-cache add tzdata && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
# COPY 源路径 目标路径 从镜像中 COPY
COPY /opt/repo/app/main /opt/ginctl
# EXPOSE 设置端口映射
EXPOSE 9999/tcp
# WORKDIR 设置工作目录
WORKDIR /opt
# CMD 设置启动命令
CMD ["./ginctl", "-env", "fat"]
Dockerfile 指令介绍
FROM
1、介绍
- FROM指令用于为镜像文件构建过程指定基础镜像,后续的指令运行于此基础镜像所提供的运行环境;
- 配合AS可以做成区分运行时镜像和构建时镜像
2、示例:
FROM golang:1.20 AS builder
# COPY 源路径 目标路径 从镜像中 COPY
COPY --from=builder /opt/repo/app/main /opt/ginctl
MAINTAINER
1、介绍
- 用于让dockerfile制作者提供本人的详细信息
2、示例
FROM golang:1.20 AS builder
MAINTAINER 'xiejiayi <looknicemm@126.com>'
COPY
1、介绍
- 用于从docker主机复制新文件或者目录至创建的新镜像指定路径中
- 目标路径,即正在创建的image的文件系统路径;建议使用绝对路径,否则,COPY指定以WORKDIR为其实路径
2、示例
# FROM 基于 golang:1.20
FROM golang:1.20 AS builder
MAINTAINER 'xiejiayi <looknicemm@126.com>'
# COPY 源路径 目标路径
COPY . $GOPATH/app
ENV
1、介绍
- 用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其它指令(如ENV、ADD、COPY等)所调用
2、示例
# FROM 基于 golang:1.20
FROM golang:1.20 AS builder
MAINTAINER 'xiejiayi <looknicemm@126.com>'
# ENV 设置环境变量
ENV GOPATH=/opt/repo
ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.cn,https://gocenter.io,https://goproxy.io,direct
ENV CGO_ENABLED=0
ENV GOOS=linux
# COPY 源路径 目标路径
COPY . $GOPATH/app
WORKDIR
1、介绍
- 用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定设定工作目录
2、示例
# FROM 基于 golang:1.20
FROM golang:1.20 AS builder
MAINTAINER 'xiejiayi <looknicemm@126.com>'
# ENV 设置环境变量
ENV GOPATH=/opt/repo
ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.cn,https://gocenter.io,https://goproxy.io,direct
ENV CGO_ENABLED=0
ENV GOOS=linux
#用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定设定工作目录
WORKDIR $GOPATH/app
# COPY 源路径 目标路径
COPY . $GOPATH/app
RUN
1、介绍
- 用于指定docker build过程中运行的程序,其可以是任何命令
2、示例
# FROM 基于 golang:1.20
FROM golang:1.20 AS builder
MAINTAINER 'xiejiayi <looknicemm@126.com>'
# ENV 设置环境变量
ENV GOPATH=/opt/repo
ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.cn,https://gocenter.io,https://goproxy.io,direct
ENV CGO_ENABLED=0
ENV GOOS=linux
#用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定设定工作目录
WORKDIR $GOPATH/app
# COPY 源路径 目标路径
COPY . $GOPATH/app
# RUN 执行 go build .
RUN cd $GOPATH/app &&go build main.go
EXPOSE
1、介绍
- 用于为容器打开指定要监听的端口以实现与外部通信
2、 示例
# FROM 基于 alpine:latest
FROM alpine:latest
# RUN 设置 Asia/Shanghai 时区
RUN apk --no-cache add tzdata && \
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
# COPY 源路径 目标路径 从镜像中 COPY
COPY /opt/repo/app/main /opt/ginctl
# EXPOSE 设置端口映射
EXPOSE 9999/tcp
CMD
1、介绍
- 类似于RUN指令,CMD指令也可用于运行任何命令或应用程序,不过,二者的运行时间点不同
- CMD指令的首要目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止;不过,CMD指定的命令其可以被docker run的命令行选项所覆盖
# CMD 设置启动命令
CMD ["./ginctl", "-env", "fat"]
ENTRYPOINT
1、
- 类似CMD指令的功能,用于为容器指定默认运行程序,从而使容器像是一个单独的可执行程序
- 与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定指定的程序
- 不过,docker run命令的–entrypoint选项的参数可覆盖ENTRYPOINT指令指定的程序
ENTRYPOINT /bin/httpd -f -h ${WEB_DOC_ROOT}
HEALTHCHECK
1、介绍
- HEALTHCHECK指令告诉Docker如何测试容器以检查它是否仍在工作
- 即使服务器进程仍在运行,也可以检测出陷入无限循环且无法处理新连接的Web服务器等情况
2、语法格式
HEALTHCHECK [OPTIONS] CMD command (通过在容器内运行命令来检查容器运行状况)
HEALTHCHECK NONE (禁用从基础映像继承的任何运行状况检查)
1)常见选项:
- -interval=DURATION (default: 30s):每隔多长时间探测一次,默认30秒
- timeout= DURATION (default: 30s):服务响应超时时长,默认30秒
- -start-period= DURATION (default: 0s):服务启动多久后开始探测,默认0秒
- -retries=N (default: 3):认为检测失败几次为宕机,默认3次
2)返回值
- 0:容器成功是健康的,随时可以使用
- 1:不健康的容器无法正常工作
- 2:保留不使用此退出代码
3、示例
1)编写dockerfile文件
检测web1容器的10080端口(其实打开的是80端口,10080并没有打开,所以会检测失败)
FROM busybox:latest
MAINTAINER '111'
ENV WEB_DOC_ROOT="/data/web/html"
RUN mkdir -p ${WEB_DOC_ROOT} && \
echo "<h1>Busybox httpd server</h1>" > ${WEB_DOC_ROOT}/index.html
CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
HEALTHCHECK CMD wget -O - -q [http://${IP:-0.0.0.0}:10080/]