dockerfile部署goweb项目

Posted issue是fw

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dockerfile部署goweb项目相关的知识,希望对你有一定的参考价值。

来源于liwenzhou

样例部署的代码

package main

import (
	"fmt"
	"net/http"
)

func main() 
	http.HandleFunc("/", hello)
	server := &http.Server
		Addr: ":8888",
	
  fmt.Println("server startup...")
	if err := server.ListenAndServe(); err != nil 
		fmt.Printf("server startup failed, err:%v\\n", err)
	


func hello(w http.ResponseWriter, _ *http.Request) 
	w.Write([]byte("hello liwenzhou.com!"))

编写dockerfile

在项目目录下创建文件dockerfile

FROM golang:alpine  #拉取一个基础镜像golang:alpine作为容器环境

# 为我们的镜像设置必要的环境变量(其中GOPROXY设置代理很重要,不然很多依赖无法下载)
ENV GO111MODULE=on \\
    CGO_ENABLED=0 \\
    GOOS=linux \\
    GOARCH=amd64 \\
    GOPROXY=https://goproxy.cn

# 移动到容器的工作目录:/build
WORKDIR /build

# 将代码复制到容器中(前面的点表示主服务器的当前位置也就是项目目录,后面的点表示容器的当前位置,也就是/build)
COPY . .

# 将我们的代码编译成二进制可执行文件app,这个可执行文件现在在容器的/build/app
RUN go build -o app .

# 移动到用于存放生成的二进制文件的 /dist 目录
WORKDIR /dist

# 将二进制文件从 /build 目录复制到这里
RUN cp /build/app .

# 声明服务端口(并无实际作用,相当于一个注释给别人看的,所以即使项目中使用的端口不是8889也能跑起来)
EXPOSE 8889

# 启动容器时运行的命令
CMD ["/dist/app"]

制作镜像

来到主服务器的项目目录下(当前目录结构下有dockerfile文件)

docker build . -t [镜像名]

根据镜像制作容器

docker run -p [port1]:[port2] [镜像名]

其中让主服务器的端口port1为新建容器的端口port2服务

port1只需要满足是一个被打开且空闲端口即可,而port2必须和项目中使用的端口一致

优化

上面引入镜像golang:alpine只是为了编译项目,最终得到的可执行文件则不需要依赖于go的环境

所以此时再使用golang:alpine就显得有点浪费

最后可以让得到的可执行文件跑在另一个迷你镜像scratch

修改dockerfile如下所示

FROM golang:alpine as cl  #设置名字

ENV GO111MODULE=on \\
    CGO_ENABLED=0 \\
    GOOS=linux \\
    GOARCH=amd64 \\
    GOPROXY=https://goproxy.cn

WORKDIR /build
COPY . .
RUN go build -o app .
WORKDIR /dist
RUN cp /build/app .
EXPOSE 8889

FROM scratch
#
## 从cl镜像中把/dist/app 拷贝到当前目录
COPY --from=cl /build/app /

## 需要运行的命令
ENTRYPOINT ["/app"]

以上是关于dockerfile部署goweb项目的主要内容,如果未能解决你的问题,请参考以下文章

dockerfile部署goweb项目

goweb项目部署服务器

docker+githook实现goweb项目自动发包部署

docker & gitlab 协同部署goweb环境

如何在 Docker compose 中运行一次命令

dockerfile 快速部署jar项目运行