Dockerfile :: 容器构建脚本语法解析

简单的介绍如何编写Dockerfile,Dockerfile是一个构建容器的基本的脚本,有自己的语法

FROM alpine as builder
RUN apk update ; \
        apk add git go;\
        export GOPATH=/opt/go; \
        mkdir -p /opt/gohttpproxy
COPY . /opt/gohttpproxy
RUN cd /opt/gohttpproxy &&  ls -al  && go mod download &&  go build .  && ls -al 

RUN wget -O /usr/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v1.2.5/dumb-init_1.2.5_x86_64 \
 && chmod +x /usr/bin/dumb-init

FROM alpine 
COPY --from=builder /opt/gohttpproxy/gohttpproxy /usr/bin/gohttpproxy
COPY --from=builder /usr/bin/dumb-init /usr/bin/dumb-init

ENTRYPOINT [ "/usr/bin/dumb-init" , "--" ]

CMD ["gohttpproxy", "--addr", ":8123"]

 

我们这个示例,分了两阶段构建,来最大限度的压缩最终生成的镜像的文件大小。

以这个项目为例,最终生成的镜像大小为14MB,是不是很小。

 

FROM 关键字,在这个Dockerfile中出现了两次,分别代表 构建Builder,和最终容器

第一次为: FROM alpine as builder #意思是:自alpine镜像,创建一个名为builder的构建worker

第二次为: FROM alpine #这里开始到最终,就是最终的组装容器镜像的所有流畅

 

我们先看Builder阶段,就是第一个FROM开始到第二个FROM之间

 

RUN 命令是在镜像的shell里面,执行各种命令,你安装软件,下载源代码,总之各种操作都可以,就跟你平时手输入linux命令执行一样

COPY 是复制文件或者目录,注意 . 这个符号,表示你存放源代码的 当前目录,

COPY . /opt/gohttpproxy #这个命令的意思,是把我当前目录的源代码,一股脑都拷贝到镜像容器里面的/opt/xxx目录下面

然后你就可以继续用RUN命令编译了

 

编译阶段完成之后,到了组装阶段

我们可以看到就是把各种编译之后的静态可执行文件,拷贝到对应的位置。最终有ENTRYPOINT和 CMD

 

ENTRYPOINT 这里,我们用了dumb-init来作为容器的init系统,用它的好处是可以接受各种发给容器的指令,信号。推荐用它。

CMD是各种你需要执行和部署,以及运行的应用命令。后面还可以带参数。

到CMD这一步,你所有的构建步骤都完毕了,最终就生产出你需要的镜像了。

 

 

分类: 默认 标签: 发布于: 2022-01-30 15:36:51, 更新于: 2022-01-30 15:36:51