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

即可完成多阶段构建

目录
相关文章
|
2月前
|
运维 Kubernetes Docker
利用Docker和Kubernetes构建微服务架构
利用Docker和Kubernetes构建微服务架构
|
13天前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
168 75
|
4月前
|
负载均衡 网络协议 开发者
掌握 Docker 网络:构建复杂的容器通信
在 Docker 容器化环境中,容器间的通信至关重要。本文详细介绍了 Docker 网络的基本概念和类型,包括桥接网络、宿主网络、覆盖网络和 Macvlan 网络等,并提供了创建、管理和配置自定义网络的实用命令。通过掌握这些知识,开发者可以构建更健壮和灵活的容器化应用,提高应用的可扩展性和安全性。
|
1月前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
59 9
|
2月前
|
机器学习/深度学习 数据采集 Docker
Docker容器化实战:构建并部署一个简单的Web应用
Docker容器化实战:构建并部署一个简单的Web应用
|
2月前
|
存储 监控 Linux
docker构建镜像详解!!!
本文回顾了Docker的基本命令和管理技巧,包括容器和镜像的增删改查操作,容器的生命周期管理,以及如何通过端口映射和数据卷实现容器与宿主机之间的网络通信和数据持久化。文章还详细介绍了如何使用Docker部署一个简单的Web应用,并通过数据卷映射实现配置文件和日志的管理。最后,文章总结了如何制作自定义镜像,包括Nginx、Python3和CentOS镜像,以及如何制作私有云盘镜像。
178 2
|
3月前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
本文介绍了Docker和Kubernetes在构建高效微服务架构中的应用,涵盖基本概念、在微服务架构中的作用及其实现方法。通过具体实例,如用户服务、商品服务和订单服务,展示了如何利用Docker和Kubernetes实现服务的打包、部署、扩展及管理,确保微服务架构的稳定性和可靠性。
112 7
|
2月前
|
Kubernetes 负载均衡 Docker
构建高效微服务架构:Docker与Kubernetes的完美搭档
【10月更文挑战第22天】随着云计算和容器技术的快速发展,微服务架构逐渐成为现代企业级应用的首选架构。微服务架构将一个大型应用程序拆分为多个小型、独立的服务,每个服务负责完成一个特定的功能。这种架构具有灵活性、可扩展性和易于维护的特点。在构建微服务架构时,Docker和Kubernetes是两个不可或缺的工具,它们可以完美搭档,为微服务架构提供高效的支持。本文将从三个方面探讨Docker和Kubernetes在构建高效微服务架构中的应用:一是Docker和Kubernetes的基本概念;二是它们在微服务架构中的作用;三是通过实例讲解如何使用Docker和Kubernetes构建微服务架构。
71 6
|
2月前
|
负载均衡 应用服务中间件 nginx
基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细
通过使用Nginx和Consul构建自动发现的Docker服务架构,可以显著提高服务的可用性、扩展性和管理效率。Consul实现了服务的自动注册与发现,而Nginx则通过动态配置实现了高效的反向代理与负载均衡。这种架构非常适合需要高可用性和弹性扩展的分布式系统。
40 4
|
2月前
|
负载均衡 应用服务中间件 nginx
基于Nginx和Consul构建自动发现的Docker服务架构——非常之详细
通过使用Nginx和Consul构建自动发现的Docker服务架构,可以显著提高服务的可用性、扩展性和管理效率。Consul实现了服务的自动注册与发现,而Nginx则通过动态配置实现了高效的反向代理与负载均衡。这种架构非常适合需要高可用性和弹性扩展的分布式系统。
63 3

热门文章

最新文章