草庐IT

Docker分享-CI/CD之路

糖醋沼跃鱼 2023-03-28 原文

我本来只想看看docker官方提供的CI/CD教程,然后官方引用了,Ben's blog提到了CI/CD的最佳实践,然后我就去阅读了大神的博客,然后大神引用了另一个大神的通过docker开发你的Go程序的系列文章。OK,我还挺喜欢这种引用的,那一层一层看吧,肯定都是好内容。

Chris大神说他刚开始加入开发团队的时候,也遇到了很多编程语言,配置开发环境的问题,经常需要问同事帮忙,还经常被各种工具困扰,这些过程非常花费时间,并且他在维护debug CI过程的时候也非常痛苦。

他提到了一个角度我觉得很好,他说Go开发的工具链,提供快速编译时间,内置依赖管理,简单的交叉编译。但工具链会遇到诸多Go版本不匹配,缺少依赖,配置不同的问题。一个很好的例子就是在许多项目中使用了gRPC,因此特定版本的protoc也很重要。

大神的博客涵盖了构建,测试,CI和优化方案帮助大家更快上手。

迎接究极干货

从简单的go程序开始:

package main

import "fmt"

func main() {
    fmt.Println("Hello world!")
}

通过go build就可以编译成二进制文件。

go build -o bin/example .

外加简单的Dockerfile

FROM golang:1.14.3-alpine As build
WORKDIR /src
COPY . .
RUN go build -o /out/example .
FROM scratch AS bin
COPY --from=build /out/example /

说简单也不简单,两阶段构建,第一阶段,构建,用了Go Alpine镜像,Alpine镜像大家了解吧,很多语言都有这个版本,超级轻量化,常规机遇Debian的Golang轻量镜像代替品。定义了go的版本(我这个时候还在想,要不要做一个新版本的用例)。设置了工作目录,将代码复制到容器中,然后编译。第二阶段使用了临时的空镜像(这个我头次见)然后将第一阶段的编译好的耳机只文件复制到文件系统中。大神贴心的提到,如果我们的程序需要一些其他的资源比如CA证书,这些也需要包含在最终的镜像中。

小tips:
我之前使用Alpine镜像的时候,我们是不用跑docker run -it < image_id > bash的,因为Alpine不带,那怎么进一个CLI呢?可以用/bin/sh。

升级版(交叉编译版)

FROM --platform=${BUILDPLATFORM} golang:1.14.3-alpine AS build
WORKDIR /src
ENV CGO_ENABLED=0
COPY . .
ARG TARGETOS
ARG TARGETARCH
RUN GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -o /out/example .

FROM scratch AS bin
COPY --from=build /out/example /

使用了BUILDPLATFORM设置基础镜像平台。使用TARGETOS和TARGETARCH告诉Go在那个平台构建。

大神还提供了Makefile,makfile我还没有学过多语法,一起看看吧

all: bin/example
.PHONY: bin/example
bin/example:
    @docker build . --target bin --output bin/ --platform local

使用make,或者make bin/example都能构建。

再进一步

FROM --platform=${BUILDPLATFORM} golang:1.14.3-alpine AS build
WORKDIR /src
ENV CGO_ENABLED=0
COPY . .
ARG TARGETOS
ARG TARGETARCH
RUN GOOS=${TARGETOS} GOARCH=${TARGETARCH} go build -o /out/example .

FROM scratch AS bin-unix
COPY --from=build /out/example /

FROM bin-unix AS bin-linux
FROM bin-unix AS bin-darwin

FROM scratch AS bin-windows
COPY --from=build /out/example /example.exe

FROM bin-${TARGETOS} AS bin

这已经多阶段方案了吧,Linux(bin-linux),macOS(bin-darwin),windows(bin-windows)。我的天真希望我不要遇到这些问题。这些可以让我动态选择编译目标。

然后再优化Makefile

all: bin/example

PLATFORM=local

.PHONY: bin/example
bin/example:
   @docker build . --target bin --output bin/  --platform ${PLATFORM}

然后我们就可以指定使用平台了

make PLATFORM=windows/amd64

makefile俩面的参数能这么直接传真实学到了

还能学到一点

大神提到了使用.dcokerignore减少不需要的内容,如果我们的项目通过git进行代码管理,我觉得大多数的项目都是git管理吧,我们可以排出.git/目录, 这一点再docker官网的教程了都没写。

reference

本文所有的例子都来自于大神的博客: https://www.docker.com/blog/containerize-your-go-developer-environment-part-1/

有关Docker分享-CI/CD之路的更多相关文章

  1. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  2. node.js - 如何在 Travis CI 上的一个项目中运行 Node.js 和 Ruby 测试 - 2

    我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每

  3. ruby-on-rails - 私有(private) gem 没有安装在 docker 中 - 2

    我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss

  4. ruby-on-rails - 将 Heroku 环境变量传输到 Docker 实例 - 2

    我在Heroku上构建了一个必须在Docker容器内运行的RoR应用程序。为此,我使用officialDockerfile.因为它在Heroku中很常见,所以我需要一些附加组件才能使这个应用程序完全运行。在生产中,变量DATABASE_URL在我的应用程序中可用。但是,如果我尝试其他一些使用环境变量(在我的例子中是Mailtrap)的加载项,变量不会在运行时复制到实例中。所以我的问题很简单:如何让docker实例在Heroku上执行时知道环境变量?您可能会问,我已经知道我们可以在docker-compose.yml中指定一个environment指令。我想避免这种情况,以便能够通过项目

  5. ruby - 更新 gem 时 Docker 包安装缓存问题 - 2

    我在开发和生产中都使用docker,真正困扰我的一件事是docker缓存的简单性。我的ruby​​应用程序需要bundleinstall来安装依赖项,因此我从以下Dockerfile开始:添加GemfileGemfile添加Gemfile.lockGemfile.lock运行bundleinstall--path/root/bundle所有依赖项都被缓存,并且在我添加新gem之前效果很好。即使我添加的gem只有0.5MB,从头开始安装所有应用程序gem仍然需要10-15分钟。由于依赖项文件夹的大小(大约300MB),然后再花10分钟来部署它。我在node_modules和npm上遇到了

  6. 【详解】Docker安装Elasticsearch7.16.1集群 - 2

    开门见山|拉取镜像dockerpullelasticsearch:7.16.1|配置存放的目录#存放配置文件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/config#存放数据的文件夹mkdir-p/opt/docker/elasticsearch/node-1/data#存放运行日志的文件夹mkdir-p/opt/docker/elasticsearch/node-1/log#存放IK分词插件的文件夹mkdir-p/opt/docker/elasticsearch/node-1/plugins若你使用了moba,直接右键新建即可如上图所示依次类推创建

  7. 转转测试环境docker化实践 - 2

        测试环境对于任何一个软件公司来讲,都是核心基础组件之一。转转的测试环境伴随着转转的发展也从单一的几套环境发展成现在的任意的docker动态环境+docker稳定环境环境体系。期间环境系统不断的演进,去适应转转集群扩张、新业务的扩展,走了一些弯路,但最终我们将系统升级到了我们认为的终极方案。下面我们介绍一下转转环境的演进和最终的解决方案。1测试环境演进1.1单体环境    转转在2017年成立之初,5台64G内存的机器,搭建5个完整的测试环境。就满足了转转的日常所需。一台分给开发,几台分给测试。通过沟通协调就能解决多分支并行开发下冲突问题。1.2动态环境+稳定环境    随着微服务化的进

  8. 焕新古文化传承之路,AI为古彝文识别赋能 - 2

    目录1古彝文与古典保护2古文识别的挑战2.1西文与汉文OCR2.2古彝文识别难点3合合信息:古彝文保护新思路3.1图像矫正3.2图像增强3.3语义理解3.4工程技巧4总结1古彝文与古典保护彝文指的是云南、贵州、四川等地的彝族人使用的文字,区别于现代意义上的彝文,古彝文指的是在民间流通使用的原生态彝文,多达87046字。古彝文的起源距今至少数千年,是世界上最古老的文字之一。对古彝文字集研究有助于理解尚未被翻译成汉文、用字尚未规范化的古籍,更深层、透彻地作用于传统文化保护。古彝文字义对照图(网络资料+邵文苑供图)古籍是不可再生的宝贵资源,应当得到妥善保护。中国的古籍在历史上迭经水火兵燹等自然灾害、

  9. 连续3天3场分享,KubeVela@KubeCon EU 2023 抢鲜看! - 2

    自从2019年OpenApplicationModel诞生以来,KubeVela已经经历了几十个版本的变化,并向现代应用程序交付先进功能的方向不断发展。最近,KubeVela完成了向CNCF孵化项目的晋升,标志着社区的发展来到一个新的里程碑。今天,KubeVela社区内活跃着大量来自全球的开发者,共同推动KubeVela项目的落地和发展。在即将开幕的KubeCon+CloudNatvieConEurope2023上,我们惊喜地发现,连续3天,KubeVela项目的贡献者、企业用户和来自阿里云的核心维护者,将从不同角度展对KubeVela项目的分享。让我们先睹为快!🎙️BuildingaPlat

  10. ruby-on-rails - 在 Facebook、转推等上分享直接 Ruby gem 中的按钮? - 2

    注意http://techcrunch.com/2010/04/04/he-even-makes-coldplay-sound-fun/顶部的那些按钮在社交网络上分享网址?我想为我正在构建的网站做一些非常相似的事情。ShareThis提供了一个可以做同样事情的小部件,但它是品牌化的和外部的。我正在寻找纯Ruby解决方案。包含可包含在RailsApplicationHelper类中的模块的gem将是完美的。在我重新发明轮子之前,感谢您的建议!想象一下: 最佳答案 我能找到的最好的是:http://www.addthis.com/这里有

随机推荐