首页 > 其他分享 >Golang项目使用Dockerfile部署

Golang项目使用Dockerfile部署

时间:2023-03-10 17:13:24浏览次数:35  
标签:golang RUN 部署 demo app Golang ## go Dockerfile

前言

关于在构建golang编写的web项目中使用dockerfile的一些总结。

通过查阅资料后,写下了如下配置:

一般模式

会安装golang编译环境,镜像文件包会比较大。

# 构建golang运行环境 使用别名:builder
FROM golang:1.19 as builder

# 设置环境变量
ENV HOME /app
ENV CGO_ENABLED 0
ENV GOOS linux

# 设置工作目录 - 我们所有的文件都存放在工作目录中 
# 目前来说:COPY go.mod go.sum ./ && COPY . .
# golang的docker环境中会出现:
## /app/build/Dockerfile
## /app/cmd/demo/main.go
## /app/go.mod
## /app/README.MD
WORKDIR /app
COPY . .
# 下载依赖
RUN go mod download

# 编译app
RUN go build -v -a -installsuffix cgo -o demo cmd/demo/main.go

FROM alpine:latest

RUN apk --no-cache add ca-certificates

# 设置工作目录
WORKDIR /bin/

# 将上个容器编译的二进制文件复制到 工作目录
# 也就是:copy golang环境/工作目录/demo alpine环境/工作目录
COPY --from=builder /app/demo .

# 所以这里执行的命令是:/bin/demo
ENTRYPOINT ["/bin/demo"]

极简模式(运行时可能出现 no found 的错误)

直接将编辑后的文件放入容器中,[alpine]镜像是一个非常小的环境。

FROM alpine:latest
# 在容器根目录 创建一个 apps 目录
WORKDIR /apps

COPY cmd/demo/demo /apps/demo

# 设置时区为上海
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone

# 设置编码
ENV LANG C.UTF-8

# 创建软链接
RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2

# 暴露端口
EXPOSE 8080

# 运行golang程序的命令
ENTRYPOINT ["/apps/demo"]


代码

结构

  • cmd/demo/main.go
  • build/Dockerfile

代码

  • main.go

    package main
    
    import (
    	"log"
    	"net/http"
    	"time"
    )
    
    func main() {
    	s := &http.Server{
    		Addr:           ":8080",
    		Handler:        demoServer{},
    		ReadTimeout:    10 * time.Second,
    		WriteTimeout:   10 * time.Second,
    		MaxHeaderBytes: 1 << 20,
    	}
    	log.Fatal(s.ListenAndServe())
    }
    
    type demoServer struct{}
    
    func (s demoServer) ServeHTTP(r http.ResponseWriter, w *http.Request) {
    	r.Write([]byte("hello world"))
    }
    
    
  • Dockerfile

    FROM alpine:latest
    # 在容器根目录 创建一个 apps 目录
    WORKDIR /bin
    
    COPY cmd/demo/demo /bin/golang_app
    
    # 设置时区为上海
    RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
    RUN echo 'Asia/Shanghai' >/etc/timezone
    
    # 设置编码
    ENV LANG C.UTF-8
    
    # 创建软链接
    RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
    
    # 暴露端口
    EXPOSE 8080
    
    # 运行golang程序的命令
    ENTRYPOINT ["/bin/golang_app"]
    

构建&&运行

# 在项目根目录执行,也就是cmd、build的同级目录下;
## 构建
docker build -t demo:v1 -f ./build/Dockerfile .

## 运行
docker run --rm -itd -p 8118:8080 demo:v1

## 浏览器访问 http://localhost:8118/ 出现 hello world表明部署成功

备注

进入alpine 容器方法: docker exec -it xxxx容器idxxxx /bin/sh

注意事项

如果打包成功,但是运行时出现找不到文件,那么很有可能是出现缺失库文件。

Alpine使用的c库使用mini版的musl libc与其他Linux发行版使用的gnu libc不一样。虽说号称兼容,但也只是部分兼容了,缺啥补啥就是,通过一个软链接来关联。

## 创建软链接
mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2

标签:golang,RUN,部署,demo,app,Golang,##,go,Dockerfile
From: https://www.cnblogs.com/boyane/p/17204056.html

相关文章

  • dockerfile
    FROMopenjdk:8u191-jdk-alpine3.9MAINTAINERgggggRUNecho'http://mirrors.aliyun.com/alpine/v3.9/main'>/etc/apk/repositoriesRUNecho'http://mirrors.......
  • (转)golang 读写文件的四种方式
    原文:https://blog.csdn.net/whatday/article/details/103938124读文件读取的文件放在file/test:也就是file包下的test这个文件,里面写多一点文件读文件方式一:利用ioutil.R......
  • docker部署Jenkins
    可以去Jenkins官网DockerHub的GitHub仓库,拷贝最新的部署脚本:https://github.com/jenkinsci/docker/blob/master/README.mddockerrun-p8888:8080-p55551:50000--r......
  • golang 自行实现一个base64加密
    packagemainimport( "fmt" "strconv")constbase64table="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"funcMybase64(astring){......
  • vue部署在Apache上 刷新404问题
    //在项目根目录下新建.htaccess文件<IfModulemod_rewrite.c>RewriteEngineOnRewriteBase/RewriteRule^index\.html$-[L]RewriteCond%{REQUEST_......
  • Odoo 部署windows server 2012
    需要安装前置补丁#clearcompressionflag.exe、KB2919442、KB2919355、KB2932046、KB2959977、KB2937592、KB2938439、KB2934018。使用odoo14官网安装包#地址:https://ww......
  • CentOS 7 部署 HDP 3.3.1
    一、环境服务器名称配置IP地址备注hdp-161-1418核/16G内存/300GSSD硬盘10.32.161.141MGR/Agenthdp-161-1428核/16G内存/300GSSD硬盘10.32.161.142Age......
  • Docker 部署 zookeeper
    拉取ZooKeeper镜像最新版本dockerpullzookeeper:latest创建数据卷文件mkdir-pm700./zookeeper/{data,conf,logs} #指定目录下创建多个文件夹并授权700运行......
  • Docker部署mysql5.7与redis6.2.6
    Linux环境:centos7.6#首先创建docker相关数据卷挂载目录mkdir-pdocker/{nexus3,mysql,redis}一、部署mysql1.搜索版本dockersearchmysql2.安装mysql5.7dockerpu......
  • Docker部署gitlab
    Linux环境:centos7.6一、安装git1.安装git yuminstall-ygit2.查看git版本gitversion--3.设置git的账户信息gitconfig--globaluser.name"pss"gitconfig--gl......