docker的多阶段构建

简介: docker的多阶段构建

如何执行go程序

写一个go的程序:

package main
import "fmt"
func main() {
   fmt.Println("hello world")
}

在本地的话,我们可以有2种方案执行

go run main.go
 go build -o main main.go  && ./main

直接go run运行或者编译main.go成二进制之后,运行二进制

如何放到docker中运行?

通过以上的案例,我们得出2个方案:

1:编译一个带go环境的容器,直接执行go程序,或者进容器编译即可

2:先编译成二进制,然后把二进制文件放到一个最小的镜像中执行

很明显,第二种方案适合直接运行二进制的场景,可以使用最少的资源去执行,那么如何实现docker自动化执行呢?

我们可以先定义一个带有golang环境的容器,在编译好之后放到最小的镜像去执行

docker手动多阶段构建

定义编译成二进制的dockerfile,命名为Dockerfile.build:

FROM golang
WORKDIR /go/src/test
ADD . /go/src/test
RUN GOOS=linux GOARCH=386 go build -v -o /go/src/test/main

定义运行go的最小镜像dockerfile,命名为dockerfile.run:

FROM alpine:latest
RUN apk add -U tzdata
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
WORKDIR /root/
COPY main .
CMD \["./main"\]

通过sh命令进行多阶段构建:

#!/bin/sh
echo Building cnych/docker-multi-stage-demo:build
docker build -t cnych/docker-multi-stage-demo:build . -f Dockerfile.build  # 先进行编译  编译golang的镜像
docker create --name extract cnych/docker-multi-stage-demo:build  # 创建一个容器,但是不启动,只需要容器里面已经编译好的二进制文件
docker cp extract:/go/src/test/main ./main  # 从容器里面拷贝出二进制文件
docker rm -f extract # 删除容器
echo Building cnych/docker-multi-stage-demo:run 
docker build --no-cache -t cnych/docker-multi-stage-demo:run . -f Dockerfile.run  # 编译运行的镜像
rm ./main # 删除二进制文件
docker run -it --name docker-test cnych/docker-multi-stage-demo:run # 运行镜像,这行命令可以忽略,自己手动运行

运行脚本后输出:

image.png

docker多阶段构建

在docker的新版本中,直接支持了在dockerfile中多阶段构建:

创建一个新的Dockerfile.new文件:

FROM golang AS build-env
ADD . /go/src/test
WORKDIR /go/src/test
RUN GOOS=linux GOARCH=386 go build -v -o /go/src/test/main
FROM alpine
RUN apk add -U tzdata
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai  /etc/localtime
COPY --from=build-env /go/src/test/main /usr/local/bin/main
CMD \[ "main" \]

我们只需要一个dockerfile文件,即可完成构建命令,并且不需要新的shell命令去删除构建的临时文件,构建和启动命令:

docker build -t cnych/docker-multi-stage-demo:latest -f ./Dockerfile.new ./
 docker run -it --name docker-test cnych/docker-multi-stage-demo:latest

image.png

即可完成多阶段构建

目录
相关文章
|
3月前
|
人工智能 前端开发 Docker
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
在 AI 智能体开发中,开发者常面临本地调试与云端部署的矛盾。本文介绍如何通过 Docker Compose 与 Docker Offload 解决这一难题,实现从本地快速迭代到云端高效扩容的全流程。内容涵盖多服务协同、容器化配置、GPU 支持及实战案例,助你构建高效、一致的 AI 智能体开发环境。
345 2
从本地到云端:用 Docker Compose 与 Offload 构建可扩展 AI 智能体
|
3月前
|
JavaScript Docker 容器
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
362 100
|
3月前
|
缓存 安全 Linux
优化Docker镜像大小的多阶段构建实践
优化Docker镜像大小的多阶段构建实践
291 99
|
3月前
|
缓存 前端开发 Docker
Docker Layer Caching:加速你的容器构建
Docker Layer Caching:加速你的容器构建
|
3月前
|
安全 Go Docker
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
|
8月前
|
Docker 容器 Perl
云效flow构建docker镜像更换apt源为阿里镜像源
在 Dockerfile 中添加命令以更换 Debian 源为阿里云镜像,加速容器内软件包下载。核心命令通过 `sed` 实现源地址替换,并更新 apt 软件源。其中 `cat` 命令用于验证替换是否成功,实际使用中可删除该行。
1641 32
|
3月前
|
Java Docker 容器
使用Docker多阶段构建优化镜像大小
使用Docker多阶段构建优化镜像大小
189 8
|
运维 Kubernetes Docker
利用Docker和Kubernetes构建微服务架构
利用Docker和Kubernetes构建微服务架构
|
8月前
|
监控 Java Go
无感改造,完美监控:Docker 多阶段构建 Go 应用无侵入观测
本文将介绍一种基于 Docker 多阶段构建的无侵入 Golang 应用观测方法,通过此方法用户无需对 Golang 应用源代码或者编译指令做任何改造,即可零成本为 Golang 应用注入可观测能力。
430 85

热门文章

最新文章