docker打包golang应用的过程分析

 更新时间:2023年03月31日 11:36:49   作者:qq_42170897  
这篇文章主要介绍了docker打包golang应用的过程分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、错误的打包方式

在本地环境编译,然后将可执行程序放入 alpine(docker.io/alpine:latest)

1.准备web程序

package main
 
import (
    "fmt"
    "net/http"
)
 
func main() {
    server := &http.Server{
        Addr: ":8888",
    }
 
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "hello world")
    })
 
    fmt.Println("server startup...")
    if err := server.ListenAndServe(); err != nil {
        fmt.Printf("server startup failed, err:%v\n", err)
    }
}

go build hello.go

2.dockerfile

FROM       docker.io/alpine:latest
MAINTAINER demo <juest a demo>
 
#alpine内的包管理
RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main" > /etc/apk/repositories
#安装bash
RUN apk add --update bash && rm -rf /var/cache/apk/*
 
RUN mkdir -p /data/go
COPY hello /data/go
 
EXPOSE 8888
 
ENTRYPOINT ["/data/go/hello"]

3.构建镜像

docker build -t demo/go-hello:1.0 -f dockerfile .

4.将在本地生成将demo/go-hello:1.o镜像

5.创建并运行容器

原因:编译的hello二进制程序不是存静态程序,还依赖一些库,但这些库在alpine镜像中找不到。

二、正确的打包流程

需要放入alpine镜像里运行的go程序,可以直接使用golang:alpine来编译,但我们在golang:alpine基础上再构建一个镜像,这个镜像中包含bash、GO111MODULE、GOPROXY等环境变量。

1.dockerfile

FROM docker.io/golang:alpine
 
RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main" > /etc/apk/repositories
RUN apk add --update bash && rm -rf /var/cache/apk/*
 
# 为我们的镜像设置必要的环境变量
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64\
    GOPROXY=https://goproxy.cn,direct

2.构建自己的go编译镜像

docker build -t go-build:1.0 -f dockerfile .

3.运行go-build:1.0 镜像,编译go项目代码:

#xxx为本地go代码路径
docker run -it --rm -v xxx:/data/go demo/go-build:1.0 /bin/bash
cd /data/go
go build hello.go

生成了hello可执行文件,且为纯静态的。

将编译得到的hello二进制打入alpine:latest

dockerfile2

FROM       docker.io/alpine:latest
MAINTAINER demo <juest a demo>
 
#alpine内的包管理
RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main" > /etc/apk/repositories
#安装bash
RUN apk add --update bash && rm -rf /var/cache/apk/*
 
RUN mkdir -p /data/go
COPY hello /data/go
 
EXPOSE 8888
 
ENTRYPOINT ["/data/go/hello"]

5.打包

docker build -t demo/go-hello:1.0 -f dockerfile2 .

6.运行demo/go-hello:1.0

三、使用scratch构建镜像

scratch为空镜像,适合那些没有任何外部依赖的程序,刚好前面的hello程序没有任何依赖!

1.dockerfile3

FROM      scratch
MAINTAINER demo <juest a demo>
 
COPY hello /
 
EXPOSE 8888
 
ENTRYPOINT ["/hello"]

2.构建

docker build -t demo/go-hello:2.0 -f dockerfile3 .

3.以scratch为基础构建出来的镜像是最小的

运行

四、参考以太坊的打包

目录结构

dockerfile

# Support setting various labels on the final image
ARG COMMIT=""
ARG VERSION=""
ARG BUILDNUM=""
 
# Build Geth in a stock Go builder container
FROM golang:alpine as builder
 
RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main" > /etc/apk/repositories
RUN apk add --no-cache gcc musl-dev linux-headers git
 
ENV GO111MODULE=on \
    CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64\
    GOPROXY=https://goproxy.cn,direct
 
# Get dependencies - will also be cached if we won't change go.mod/go.sum
COPY go.mod /web/
COPY go.sum /web/
RUN cd /web && go mod download
 
ADD . /web
RUN cd /web && go build -o ./cmd/app main.go
 
# Pull Geth into a second stage deploy alpine container
FROM alpine:latest
 
RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main" > /etc/apk/repositories
RUN apk add --no-cache ca-certificates
COPY --from=builder /web/cmd/app /usr/local/bin/
 
EXPOSE 8080
ENTRYPOINT ["app"]
 
# Add some metadata labels to help programatic image consumption
ARG COMMIT=""
ARG VERSION=""
ARG BUILDNUM=""
 
LABEL commit="$COMMIT" version="$VERSION" buildnum="$BUILDNUM"

到此这篇关于docker打包golang应用的文章就介绍到这了,更多相关docker打包golang应用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker之限制容器的资源使用过程

    Docker之限制容器的资源使用过程

    这篇文章主要介绍了Docker之限制容器的资源使用过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Docker使用编写dockerfile启动node.js应用

    Docker使用编写dockerfile启动node.js应用

    这篇文章主要介绍了Docker使用编写dockerfile启动node.js应用,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • docker指令收集整理(收藏)

    docker指令收集整理(收藏)

    Docker 是一个基于Linux容器(LXC-linux container)的高级容器引擎,基于go语言开发,源代码托管在 Github 上, 遵从Apache2.0协议开源。这篇文章主要介绍了docker指令收集整理(收藏),需要的朋友可以参考下
    2017-02-02
  • ubuntu17.10安装docker-ce的方法

    ubuntu17.10安装docker-ce的方法

    本篇文章主要介绍了ubuntu 17.10 安装docker-ce的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • docker compose入门helloworld的详细过程

    docker compose入门helloworld的详细过程

    docker-compose是基于docker的,所以我们需要先安装docker才能使用docker-compose,接下来通过本文给大家介绍docker compose入门helloworld的过程,一起看看吧
    2021-09-09
  • docker构建nginx alpine镜像实现步骤

    docker构建nginx alpine镜像实现步骤

    这篇文章主要介绍了docker构建nginx alpine镜像实现步骤,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Docker上实现Redis集群搭建

    Docker上实现Redis集群搭建

    redis集群对于很多人来说非常熟悉,虽然集群搭建的文章在网上很多,但是今天给大家介绍的是在docker上实现Redis集群搭建,感兴趣的可以了解下
    2021-05-05
  • k8s手动拉取docker镜像的方法示例

    k8s手动拉取docker镜像的方法示例

    docker是一种便捷的容器化解决方案,它可以通过拉取镜像的方式轻松地部署和管理应用程序,本文主要介绍了k8s手动拉取docker镜像的方法示例,感兴趣的可以了解一下
    2024-02-02
  • Docker 中快速构建 Redis Cluster 集群的详细过程

    Docker 中快速构建 Redis Cluster 集群的详细过程

    Redis Cluster 集群模式提供了数据分区和高可用性,通过分布式方式存储和管理数据,实现更高的扩展性,本指南将演示如何使用 Docker 快速构建一个包含 3 个节点的 Redis Cluster 集群,感兴趣的朋友一起看看
    2024-05-05
  • docker的镜像存放地址在哪里

    docker的镜像存放地址在哪里

    Docker镜像(Image)是用于创建 Docker 容器的模板,下面这篇文章主要给大家介绍了关于docker的镜像存放地址在哪里的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-01-01

最新评论