avatar

阿炳的小站

谁知难过 分一丁目赠我

  • 首页
  • 关于
  • 友链
Home Docker 使用技巧(1)
文章

Docker 使用技巧(1)

Posted 2024-09-19 Updated 2024-09- 20
By abing
4~5 min read

Docker分阶段构建

其实之前一直用docker都是无脑直接把对应的代码都拖进去同一个容器然后编译运行,但是这样子会带来一个问题,就是我们这个容器会变得很大,因为它不仅包含了运行所需要的环境,同时也包含了编译所需要的环境。

这时候,我们可以敏锐地察觉到,其实运行环境并不需要和编译环境一样,我们实际运行往往只需要更小的环境,能够执行对应的命令操作,以及查看对应的日志就可以了。

所以我们将编译这一步隔离出来,我们直接将编译的结果放进对应的容器就可以了

FROM alpine

WORKDIR /build

COPY server .

CMD ["./server"]

可以看到,我们将对应的编译结果,拷贝到对应的容器中,然后运行它就可以了

这样子一来,我们就解决了运行容器过大的问题。

但是,依旧有个问题接踵而至了,比如我们开发的时候,往往是协同开发的,这时候,如果协同开发的服务器中,有人更改了服务器环境中的一些选项,这时候,你再来编译你的项目,就可能出现了一些难以发现的隐藏的问题,等待着哪一天爆发出来。

这时候,联想到我们先前采用的方法,我们把编译的这一个过程,也放到对应的容器中去执行,然后再将执行的结果,放入到运行的容器中,而这时候,我们只需要规定好这个编译容器的对应的参数,就可以保证我们每次编译的时候,对应的选项都是确定的。

FROM golang:alpine AS builder

LABEL stage=gobuilder

ENV CGO_ENABLED 0
ENV GOPROXY https://goproxy.cn,direct
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

RUN apk update --no-cache && apk add --no-cache tzdata

WORKDIR /build

ADD go.mod .
ADD go.sum .
RUN go mod download
COPY . .
RUN go build -ldflags="-s -w" -o /app/server ./cmd/cyclopropane/server.go


FROM scratch

COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /usr/share/zoneinfo/Asia/Shanghai
ENV TZ Asia/Shanghai

WORKDIR /app
COPY --from=builder /app/server /app/server
COPY --from=builder /build/test-conf.yaml /app/test-conf.yaml

CMD ["./server"]

其实这种加中间层的方式在计算机行业其实也是蛮常见的,现在的计算机的整个体系,无不是在一点一点增加中间层,可能是为了确保安全,也可能是为了增加更多的功能,当遇到一些问题的时候,我们不妨也尝试着加一点中间层,说不定哪天,我们就开创了一个新的方向呢?

鸣谢万俊峰Kevin大佬的博客:构建 Go 应用 docker 镜像的十八种姿势 - 万俊峰Kevin - 博客园 (cnblogs.com)

默认分类
工具技巧 docker使用技巧
License:  CC BY 4.0
Share

Further Reading

Sep 19, 2024

Docker 使用技巧(1)

Docker分阶段构建 其实之前一直用docker都是无脑直接把对应的代码都拖进去同一个容器然后编译运行,但是这样子会带来一个问题,就是我们这个容器会变得很大,因为它不仅包含了运行所需要的环境,同时也包含了编译所需要的环境。 这时候,我们可以敏锐地察觉到,其实运行环境并不需要和编译环境一样,我们实际

Aug 31, 2024

Git 使用技巧 (1)

Rebase的妙用 当我们一个分支有多次提交,在合并到其他分支的时候,往往会出现当前分支的每次提交都与要合并到的分支出现冲突,所以我们有多少次冲突的提交,就要解决多少次冲突。 这显然太过于麻烦了,我们其实想要的基本都是最后一次提交的版本,因此,只需要解决最后一次提交的结果,和中间每次提交中有用的信息

Aug 25, 2024

沉思录 2024/8/25

自我设限 其实我们有没有可能,一直活在一种自我设限的视角之下? 我们现在想事情,往往会从各个角度去思考,这件事情能不能做,能用什么办法做。 这其实就已经活在设限之下了,因为我们本身就会难以去考虑到我们没想到的事情。 抛开没想到的事情,我们其实总是去限制说这个事情有什么样什么样的难点,我们是否有办法完

OLDER

Git 使用技巧 (1)

NEWER

人生的雨季

Recently Updated

  • 远行与归乡
  • 行动力与风口、供应链、营销
  • 【数据结构】顺序表 Sequential List
  • JWT 认证机制讲解与实现
  • 【共赏】《山丘》与《越过山丘》

Trending Tags

笔记 共赏 实习心得 docker使用技巧 随想沉思 工具技巧 C# 数据结构 git使用技巧

Contents

©2025 阿炳的小站. Some rights reserved.

Using the Halo theme Chirpy