dockerfile部署goweb项目
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dockerfile部署goweb项目相关的知识,希望对你有一定的参考价值。
样例部署的代码
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项目的主要内容,如果未能解决你的问题,请参考以下文章