dockerfile部署goweb项目
样例部署的代码package mainimport ("fmt""net/http")func main() {http.HandleFunc("/", hello)server := &http.Server{Addr: ":8888",}fmt.Println("server startup...")if err := server.ListenAndServe(); err != n
·
样例部署的代码
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"]
更多推荐
所有评论(0)