Dockerfile的使用

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 --from=builder /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 --from=builder /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 --start-period=3s CMD wget -O - -q [http://${IP:-0.0.0.0}:10080/]

   转载规则


《Dockerfile的使用》 by XieJiayi is licensed under a 知识共享署名 4.0 国际许可协议 许可协议。转载请注明来源
 上一篇
基于prometheus的告警监控 基于prometheus的告警监控
prometheus系统架构图手动试验:1.部署一个简单的webhook服务 apiVersion: apps/v1 kind: Deployment metadata: name: alert-webhook namespac
下一篇 
vlan、子网掩码、MAC地址、网关、DNS、三层交换机 vlan、子网掩码、MAC地址、网关、DNS、三层交换机
01 什么是VLAN VLAN中文是“虚拟局域网”。LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络——也就是广播域。 听上面的概念,肯定有不少朋友是一头雾水的
2023-01-28
  目录