zoukankan      html  css  js  c++  java
  • 如何使用docker 部署 golang 编译环境最小版

    最近 忙着将以前的系统再迭代一下,之不是用go mod 来做的,这次准备把系统改成go module的样子,以间把整个文件拷贝到镜像里面执行,所以整个文件很大,一般都有一个G,感觉不是很理理,最后决定用二次镜像的原理来搞一下,直接上代码了

    #使用最新的golang 镜像
    FROM golang:1.15.0-alpine3.12 as builder
    LABEL maintainer="zchd.ltd@gmail.com"
    #更新Alpine的软件源为国内源,提高下载速度
    RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main/" > /etc/apk/repositories 
    #因为 scratch 不带SSL 证书存储,所以要安装更新
    RUN apk update && apk add --no-cache git ca-certificates && update-ca-certificates && apk add --no-cache tzdata
    # Create 运行的帐号
    ENV USER=appuser
    ENV UID=10001
    RUN adduser     
        --disabled-password     
        --gecos ""     
        --home "/nonexistent"     
        --shell "/sbin/nologin"     
        --no-create-home     
        --uid "${UID}"     
        "${USER}"
    # 确定工作环境
    WORKDIR /app
    #将代码 拷贝进容器
    ADD . /app
    #进行golang环境的设置,开启go mod 并设置镜像
    RUN go env -w GO111MODULE=on && go env -w GOPROXY=https://goproxy.io,direct
    # 编译 镜像
    RUN CGO_ENABLED=0 GOOS=linux go build -o app
    # 使用最小的开始 制作镜像
    FROM scratch as final
    # 从编译中导入镜像Import from builder.
    #导入时区
    COPY --from=builder /usr/share/zoneinfo /usr/share/zoneinfo 
    #导入ssl 证书
    COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
    #导入帐号
    COPY --from=builder /etc/passwd /etc/passwd
    COPY --from=builder /etc/group /etc/group
    #导入golang编充好的
    COPY --from=builder /app/app .
    ADD app /
    CMD ["/app"]

    这样整个docker 环境就制作好了

     大概弄后面的镜像是44.6M,感觉还不错,必竟最开始都是1G左右

    最后,把部署的也加上

    #!/usr/bin/env bash
    git pull origin master
    docker build -t yxt-platform .
    
    docker stop yxt-platform-test
    docker rm yxt-platform-test
    docker run -d --name yxt-platform-test 
                -p 1323:1323 
                -v $(pwd)/conf/conf-docker.toml:/conf/conf.toml 
                -v $(pwd)/static:/static 
                -v $(pwd)/cert:/cert 
                --link mysql:192.168.2.3 
                --link redis:redis 
                yxt-platform

    这样就可以很愉快的玩耍啦!!!!

    后面参考 了一下

    FROM golang:1.14-alpine as builder
    WORKDIR /usr/src/app
    ENV GOPROXY=https://goproxy.cn
    RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && 
      apk add --no-cache upx ca-certificates tzdata
    COPY ./go.mod ./
    COPY ./go.sum ./
    RUN go mod download
    COPY . .
    RUN CGO_ENABLED=0 go build -ldflags "-s -w" -o server &&
      upx --best server -o _upx_server && 
      mv -f _upx_server server
    
    FROM scratch as runner
    COPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
    COPY --from=builder /usr/src/app/server /opt/app/
    CMD ["/opt/app/server"]

    参考了一下

    https://medium.com/@chemidy/create-the-smallest-and-secured-golang-docker-image-based-on-scratch-4752223b7324

    https://juejin.im/post/6844904174396637197

  • 相关阅读:
    Django----图片验证码接口
    jwt安装配置
    jwt介绍
    课程章节页面
    git使用整理
    时间复杂度和空间复杂度,排序算法
    linux源码安装mysql,shell编程学习,ubuntu
    linux之任务调度,磁盘分区,yum下载
    linux常用命令修改权限查看文档
    linux用户组相关,密码相关,文件操作,和启动级别
  • 原文地址:https://www.cnblogs.com/jackluo/p/13576448.html
Copyright © 2011-2022 走看看