Docker分享-CI/CD之路

简介: Docker分享-CI/CD之路

我本来只想看看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/

相关文章
|
9天前
|
jenkins 测试技术 持续交付
Docker最佳实践:构建高效的CI/CD流水线
【10月更文挑战第17天】在现代软件开发实践中,持续集成(Continuous Integration, CI)和持续部署(Continuous Deployment, CD)已成为提高开发效率和软件质量的重要手段。Docker作为一种容器技术,为构建一致且隔离的开发环境提供了强有力的支撑。本文将探讨如何利用Docker来优化CI/CD流程,包括构建环境的标准化、镜像管理以及与CI/CD工具(如Jenkins、GitLab CI)的集成。
30 5
|
3月前
|
jenkins Shell 持续交付
自动化部署:使用Jenkins和Docker实现CI/CD
【8月更文挑战第31天】 本文旨在引导读者了解如何通过Jenkins和Docker来实现持续集成和持续部署(CI/CD),从而优化开发流程,提升工作效率。文章将详细介绍配置Jenkins服务器、创建Docker镜像以及设置自动化构建和部署的步骤。通过实际操作案例,我们将展示如何将代码变更快速部署到测试或生产环境,确保软件质量与发布速度的双重保障。
|
3月前
|
测试技术 持续交付 开发者
使用Docker构建CI/CD流程:从理论到实践
【8月更文挑战第2天】使用Docker构建CI/CD流程,可以显著提高软件开发的效率和质量。通过容器化技术,开发者可以确保环境的一致性,快速部署和测试应用,并减少人为错误。结合合适的CI/CD工具和最佳实践,可以进一步加速软件交付过程,提高用户满意度。希望本文能为开发者在构建基于Docker的CI/CD流程时提供有价值的参考。
|
4月前
|
Kubernetes Cloud Native 持续交付
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
云原生架构的核心组成部分通常包括容器化(如Docker)、容器编排(如Kubernetes)、微服务架构、服务网格、持续集成/持续部署(CI/CD)、自动化运维(如Prometheus监控和Grafana可视化)等。
|
6月前
|
存储 测试技术 持续交付
【Docker 专栏】Docker 与 CI/CD 的集成策略
【5月更文挑战第8天】本文探讨了Docker在CI/CD流程中的作用,强调了环境一致性、快速部署和资源隔离等优势。通过在构建、测试和部署阶段集成Docker,可以提升软件开发效率和质量。具体集成策略包括使用Dockerfile构建镜像、整合CI/CD工具如Jenkins和GitLab。集成带来的好处包括提高效率、增强可靠性、加速交付和简化管理。然而,也需应对镜像管理、网络配置和安全等问题。通过案例分析,证明了Docker与CI/CD集成的有效性和必要性。
114 2
【Docker 专栏】Docker 与 CI/CD 的集成策略
|
6月前
|
jenkins Java 持续交付
Jenkins与Docker的自动化CI/CD实战
Jenkins与Docker的自动化CI/CD实战
|
6月前
|
Devops 开发工具 数据安全/隐私保护
Docker Swarm总结+CI/CD Devops、gitlab、sonarqube以及harbor的安装集成配置(3/5)
Docker Swarm总结+CI/CD Devops、gitlab、sonarqube以及harbor的安装集成配置(3/5)
235 0
|
11天前
|
存储 Docker 容器
docker中挂载数据卷到容器
【10月更文挑战第12天】
34 5
|
5天前
|
Web App开发 iOS开发 Docker
Docker 容器的日志
【10月更文挑战第31天】
16 5
|
4天前
|
存储 Kubernetes C++
Kubernetes VS Docker Swarm:哪个容器编排工具更适合你?
随着容器技术的快速发展,容器编排工具成为了现代软件开发和运维的重要环节。在众多容器编排工具中,Kubernetes和Docker Swarm无疑是最受欢迎的两个。本文将从技术特性、易用性和社区支持三个方面,对Kubernetes和Docker Swarm进行比较,以帮助您选择更适合您需求的容器编排工具。
19 3