范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Go多阶段Docker教程

  欢迎各位码农!在本教程中,我们将研究多阶段 Docker 镜像以及如何使用它们来最小化生产 Go 应用程序所需的容器大小。
  在本教程结束时,我们将涵盖以下概念:什么是多阶段 Dockerfile。我们如何为我们的 Go 应用程序构建简单的多阶段 Dockerfile
  Docker 是一种强大的容器化技术,可用于轻松启动隔离且可重现的环境,在其中构建和运行我们的应用程序。它越来越受欢迎,越来越多的云服务提供商提供本地 docker 支持,让您可以轻松部署容器化应用程序,让全世界看到!
  多阶段 Dockerfile 的需求是什么?
  为了了解多阶段 Dockerfile 为何有用,我们将创建一个简单的 Dockerfile,其中一个阶段用于构建和运行我们的应用程序,另一个 Dockerfile 具有构建阶段和生产阶段。
  一旦我们创建了这两个不同的 Dockerfile,我们应该能够比较它们,并希望自己看到多阶段 Dockerfile 比它们更简单的对应物更受欢迎!
  因此,在我之前的教程中,我们创建了一个非常简单的 Docker 镜像,我们的 Go 应用程序在其中构建和运行。这Dockerfile看起来像这样:## We specify the base image we need for our ## go application FROM golang:1.12.0-alpine3.9 ## We create an /app directory within our ## image that will hold our application source ## files RUN mkdir /app ## We copy everything in the root directory ## into our /app directory ADD . /app ## We specify that we now wish to execute ## any further commands inside our /app ## directory WORKDIR /app ## we run go build to compile the binary ## executable of our Go program RUN go build -o main . ## Our start command which kicks off ## our newly created binary executable CMD ["/app/main"]
  有了这个,我们随后可以使用一个非常简单的docker build 命令来构建我们的 Docker 镜像:$ docker build -t go-simple .
  这将创建一个镜像并将其存储在我们的本地 docker 镜像存储库中,最终看起来像这样:$ docker images REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE go-simple               latest              761b9dd5f9a4        4 seconds ago       793MB
  您应该希望注意到最后一列指出此镜像的大小为 793MB。对于构建和运行一个非常简单的 Go 应用程序的东西来说,这绝对是巨大的。
  在这个镜像中将包含编译和运行我们的 Go 应用程序所需的所有包和依赖项。使用多阶段 dockerfile,我们实际上可以通过将内容分成两个不同的阶段来显着减小这些镜像的大小。一个简单的多阶段 Dockerfile
  使用多阶段 Dockerfile,我们可以将构建和运行 Go 应用程序的任务分成不同的阶段。通常,我们从一个大镜像开始,其中包含编译 Go 应用程序的二进制可执行文件所需的所有必要依赖项、包等。这将被归类为我们的builder舞台。
  然后,我们为我们的run阶段拍摄一个更轻量级的镜像,其中仅包含运行二进制可执行文件绝对需要的内容。这通常被归类为production阶段或类似的东西。## We use the larger image which includes ## all of the dependencies that we need to ## compile our program FROM bigImageWithEverything AS Builder RUN go build -o main ./...  ## We then define a secondary stage which ## is built off a far smaller image which ## has the absolute bare minimum needed to ## run our binary executable application FROM LightweightImage AS Production CMD ["./main"]
  通过这种方式,我们受益于一致的构建阶段,并且我们受益于我们的应用程序将在生产环境中运行的绝对微小的镜像。
  注意- 在上面的 psuedo-Dockerfile 中,我使用AS关键字为我的镜像 添加了别名。这可以帮助我们区分 Dockerfile 的不同阶段,我们可以使用该--target 标志来构建特定阶段。一个真实的例子
  现在我们已经介绍了基本概念,让我们看看如何定义一个真正的多阶段 Dockerfile,它将首先编译我们的应用程序,然后在轻量级 Dockeralpine映像中运行我们的应用程序。
  出于本教程的目的,我们将从我的新Go WebSockets 教程中窃取代码,因为这演示了下载依赖项,并且是一个不平凡的示例,因此比标准示例更接近真正的Go 应用程序hello world。
  在项目目录中创建一个名为的新文件main.go并添加以下代码:package main  import (     "fmt"     "log"     "net/http"      "github.com/gorilla/websocket" )  // We"ll need to define an Upgrader // this will require a Read and Write buffer size var upgrader = websocket.Upgrader{     ReadBufferSize:  1024,     WriteBufferSize: 1024, }  // define a reader which will listen for // new messages being sent to our WebSocket // endpoint func reader(conn *websocket.Conn) {     for {         // read in a message         messageType, p, err := conn.ReadMessage()         if err != nil {             log.Println(err)             return         }         // print out that message for clarity         fmt.Println(string(p))          if err := conn.WriteMessage(messageType, p); err != nil {             log.Println(err)             return         }      } }  func homePage(w http.ResponseWriter, r *http.Request) {     fmt.Fprintf(w, "Home Page") }  func wsEndpoint(w http.ResponseWriter, r *http.Request) {     upgrader.CheckOrigin = func(r *http.Request) bool { return true }     fmt.Println(r.Host)      // upgrade this connection to a WebSocket     // connection     ws, err := upgrader.Upgrade(w, r, nil)     if err != nil {         log.Println(err)     }     // listen indefinitely for new messages coming     // through on our WebSocket connection     reader(ws) }  func setupRoutes() {     http.HandleFunc("/", homePage)     http.HandleFunc("/ws", wsEndpoint) }  func main() {     fmt.Println("Hello World")     setupRoutes()     log.Fatal(http.ListenAndServe(":8080", nil)) }
  注意- 我已经使用go mod init命令初始化了这个项目以使用 go 模块。这可以使用 Go 版本 1.11 并通过调用在 docker 容器外部本地运行 go run ./...
  接下来,我们将Dockerfile在与main.go上面的文件相同的目录中创建一个。这将具有一个builder阶段和一个production阶段,该阶段将由两个不同的基础镜像构建:## We"ll choose the incredibly lightweight ## Go alpine image to work with FROM golang:1.11.1 AS builder  ## We create an /app directory in which ## we"ll put all of our project code RUN mkdir /app ADD . /app WORKDIR /app ## We want to build our application"s binary executable RUN CGO_ENABLED=0 GOOS=linux go build -o main ./...  ## the lightweight scratch image we"ll ## run our application within FROM alpine:latest AS production ## We have to copy the output from our ## builder stage to our production stage COPY --from=builder /app . ## we can then kick off our newly compiled ## binary exectuable!! CMD ["./main"]
  现在我们已经定义了这个多阶段 Dockerfile,我们可以使用标准docker build命令继续构建它:$ docker build -t go-multi-stage .
  现在,当我们将简单镜像的大小与多阶段镜像进行比较时,我们应该会看到大小的显着差异。我们之前的go-simple镜像大小约为 800MB,而这个多阶段镜像的大小约为 1/80。$ docker images REPOSITORY              TAG                 IMAGE ID            CREATED             SIZE go-multi-stage          latest              12dd51472827        24 seconds ago      12.3MB
  如果我们想尝试运行它来验证它是否正常工作,我们可以使用以下docker run命令来实现:$ docker run -d -p 8080:8080 go-multi-stage
  这将启动以-d分离模式运行的 docker 容器,我们应该能够http://localhost:8080在浏览器中打开并看到 Go 应用程序将 Hello World消息返回给我们!
  练习-index.html从Go WebSockets 教程中复制并在浏览器中打开它,您应该会看到它连接到我们的容器化 Go 应用程序,并且您应该能够使用该docker logs命令查看日志 。结论
  总结一下,在本教程中,我们研究了如何定义一个非常简单的 Dockerfile 来创建一个沉重的 Docker 映像。然后,我们研究了如何通过使用 multi-stage 来优化这一点,Dockerfile这给我们留下了令人难以置信的轻量级镜像。
  如果您喜欢本教程,或者您有任何意见/反馈/建议,那么我很乐意在下面的建议框中听到它们!

企业的九条股权生命线作者北京市盈科(石家庄)律师事务所崔晓芬企业股权既是一门技术,也是一门艺术。优化设计的股权结构有助于维护公司和创业项目的稳定有助于在公司未来进行融资以及面对股权稀释的情况下,维护创领导干部怎么提高自己王三堂(原河北省秦皇岛市委书记)一个干部,特别是领导干部应尽可能地提高自己的全面素质,而不应只偏向某一方面。比如不仅要有抽象思维能力,而且应有形象思维能力不仅要有现实主义风格,而且央行会议罕见释放房地产利好近日召开的货币政策委员会2021年第三季度例会指出,稳健的货币政策要灵活精准合理适度,保持流动性合理充裕,增强信贷总量增长的稳定性房地产市场是本次货币政策委员会例会的最大关注点。会2022年河北省家庭农场将达7万家河北省农业农村厅印发河北省新型农业经营主体和服务主体高质量发展实施规划(20212022年)提出深入实施家庭农场培育计划和农民合作社规范提升行动。到2022年,支持家庭农场发展的政芯片光刻机第一股来了,国家大基金入股,实控人为清华教授来源中国基金报被媒体称为光刻机第一股的华卓精科,9月17日科创板上市委会议通过。光刻机第一股二次上会通过大基金入股在7月29日上会暂缓之后,华卓精科终于在9月17日上会通过了。此前BEHOW碧好电动拖把让疲惫打工人摆脱繁重家务好帮手对于996上班一族来说家务是多数人的噩梦,试问拖着疲惫不堪的躯壳,回到家中劳累了一天还有多少心情和体力去完成反正的家务?家务清洁不去做也不太现实,毕竟没有多少人愿意生活在不干净的环重磅!海航集团将一分为四,创始人股权清零9月18日,海南省海航集团联合工作组组长海航集团党委书记顾刚主持召开2021年度第39周安全生产经营例会提到,海航重整后将拆分为四个板块独立运营,各自回归主业健康发展。航空板块以海大手笔石家庄市市属国企全面重组整合筹建五大企业集团为进一步深化国有企业改革做强做优做大国有企业,9月13日,经石家庄市委常委会研究决定,市属国企重组整合方案最终确定,石家庄市拟筹建五大企业集团,聚力打造主业突出竞争力强带动作用显著第二个浦东正式面世从上海传来了一个重磅消息虹桥国际开放枢纽中央商务区十四五规划正式发布。从虹桥国际开放枢纽的命名,以及规划文本确定的目标看,这分明是第二个浦东。或者说,随着虹桥开放枢纽及其中央商务区只要2999用上次旗舰,品质旗舰一加9R正式发售4月15日,一加手机举办主题为硬核伙伴,实力集结的线上发布会,正式发布一加9R。一加9R是一款兼具超强性能和高级质感的品质旗舰。一加9R搭载高通骁龙8705G移动平台,采用120H3699元起拯救者电竞手机2Pro正式发布冷静则赢唯快不破4月8日,联想召开了以冷快为主题的新品发布会,拯救者电竞手机2Pro正式亮相。拯救者作为专属于热血玩家的电竞品牌,致力于为玩家带来极致游戏体验。联想中国区手机业务部总经理陈劲表示如
探索新物种,拥抱数字化!LTD营销中台直播课堂即将开播LTD营销SaaS中台官方直播即将开播了!为了让更多的创业者和企业主们能够更好地了解到该如何使用LTD营销中台的多种强大功能,将生意越做越大,实现业务进系统,生意找上门的数字化经营在指尖完成商务社交,如何通过LTD官微名片达成高效获客完成一次商务社交需要多久?如果你这么问一个销售人员,他可能会回答你几个小时?一天?甚至是几天。怎样把自身产品和服务的信息优势品牌价值高效地传递给客户,是每一位业务员内心最关心的问题数字化物料能力是什么?怎么让客户主动找上门想让用户了解自己的企业需要哪几个因素?这个问题的答案有很多,但总结起来可以归类为以下三个因素推广渠道宣传方式以及营销物料,这三者缺一不可!随着数字化营销模式的发展,各大企业之间的竞安兔兔发布性能排行榜,华为无缘前三?两天前,安兔兔发布了其8月5G手机性能排名,其中包括排名前10的旗舰和中端手机。在此期间,手机制造商也展示了自己的才能,直到8月底。列表中的当前10个最终进行了重大替换。OPPOX学生党的神机?麒麟990跳水1100元性价比也很高对于很多人来说,华为手机很有吸引力,但是价格往往比其他制造商高,尤其是预算不足的学生聚会,追求成本效益的用户会考虑使用价格便宜的荣耀手机,因此今天我们我们将要讨论性价比很高的麒麟9自动流水线洗碗机的正确清洗方法1。使用过的餐具应尽快放入自动洗碗机,避免餐具上的残留物风干,造成餐具清洗困难。2。避免重叠餐具,因为重叠餐具不仅不会清洁餐具,还会损坏餐具。3。清洗餐具时,必须等到洗碗机的水温达市面折叠屏手机的对决折叠哪家强?2019年年初可以说折叠屏幕风头盖过了5G。也能理解,5G这个东西看不见摸不着,尽管厂商向我们描述的5G世界就是网速更快,万物互联等等,而这一切,需要大量的时间进行基础设施建设后才小米即将召开秋季新品发布会不知道大家有没有发现,昨天小米商城的816活动界面,时间线里透露了一个信息,8月10日,小米秋季发布会,然而今天这个信息已经不见了。下半年各厂商都会发布自家的旗舰手机来继续拓展市场它的出现建筑工人又要失业了?24小时工作不间断,细思极恐由于人工智能的发展,一些体力工作者逐渐面临失业。例如,在当前的工厂中,许多流水线已被人工智能取代,人工智能不仅可以有效地完成工作,而且可以提高速度,减少危险的发生。可以看出,人工智盘点最适合年轻人的手机,给你一个难以拒绝的选择年轻这个词多年来一直被各种汽车和手机制造商使用。因为,在这个时代,年轻人是消费的主体,无论是汽车还是智能手机,都是走年轻化设计形式的潮流。所以,本文就为大家推荐两款个性独特造型高雅名副其实是安卓机皇,高刷自由续航无忧真我Q3最近又火了,一半是因为真我Q3的全系列手机直降100元,配有再送耳机延保新机礼包,让用户欢欣鼓舞另一半是因为友商推出了新的数字系列机,红米Note10,难免会被拿来比较。当