一. 准备golang程序
package main
import "github.com/gin-gonic/gin"
func main() {
go func() {
r1 := gin.Default()
r1.GET("/sayHello/", func(c *gin.Context) {
c.JSON(200, "hello1")
})
r1.Run(":8992")
}()
r := gin.Default()
r.GET("/sayHello/", func(c *gin.Context) {
c.JSON(200, "hello")
})
r.Run(":8991")
}
二. 下载docker镜像
默认已经安装好docker
docker pull centos
三. 编译二进制文件
我这里使用makefile
makefile文件如下
#!/bin/bash
export LANG=zh_CN.UTF-8
ENVARG=GOPATH=$(CURDIR) GO111MODULE=on
LINUXARG=CGO_ENABLED=1 GOOS=linux GOARCH=amd64
BUILDARG=-ldflags " -s -X main.buildTime=`date '+%Y-%m-%dT%H:%M:%S'` -X main.gitHash=(`git symbolic-ref --short -q HEAD`)`git rev-parse HEAD`"
gateway:
cd src; ${ENVARG} go build ${BUILDARG} -o ./projects/docker_demo/main ./projects/docker_demo/main.go;
linux_gateway:
cd src; ${ENVARG} ${LINUXARG} go build ${BUILDARG} -o ./projects/docker_demo/main ./projects/docker_demo/main.go;
执行编译linux二进制
make linux_gateway
报错
查找原因网上说是因为os本身系统库不兼容的问题,首先因为我是在macos上编译linux的版本,所以需要安装:
brew install FiloSottile/musl-cross/musl-cross
同样参数要调整
CGO_ENABLED=1 GOOS=linux GOARCH=amd64 CC=x86_64-linux-musl-gcc CXX=x86_64-linux-musl-g++
我这里看到应该是cgo报的错,我们这里是简单的示例,没用用到cgo,所以把CGO_ENABLED设置为0,就可以编译通过
CGO_ENABLED=0
CGO_ENABLED
环境变量对我们程序的影响。 CGO_ENABLED
是用来控制golang 编译期间是否支持调用 cgo 命令的开关,其值为1或0,默认情况下值为1,可以用 go env
查看默认值。
四. 编写Dockerfile文件
# 指定基础镜像
FROM centos:latest
LABEL authors="docker-test"
# 设置工作目录
WORKDIR /app/gateway
# 复制当前目录下的所有文件到工作目录
COPY . .
# 声明容器运行时需要暴露的端口
EXPOSE 8991 8992
# 定参
ENTRYPOINT ["./main"]
五. 构建镜像
docker build -t my-golang-app .
docker images | grep my-golang-app
#my-golang-app latest dfd4bab9dabd About a minute ago 239MB
运行镜像
docker run -idt -p 8991:8991 -p 8992:8992 my-golang-app
#630728cd4ef04d4fc2ee94a986eaaed281d60bd74922126d4f345d12ed941c5f
docker ps
#CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
#630728cd4ef0 my-golang-app "./main" 10 seconds ago Up 10 seconds 0.0.0.0:8991-8992->8991-8992/tcp charming_yonath
可以看到已经运行起来
六. 请求服务接口
可以看到已经通了
七. 推送images到docker hub
7.1 docker打tag
docker tag my-golang-app:latest 你的账号/my-golang-app:latest
7.2 推送到docker hub
docker push pengdylan7/my-golang-app:latest
docker push 你的账号/my-golang-app:latest
docker客户端里可以看到推送成功文章来源:https://www.toymoban.com/news/detail-486229.html
文章来源地址https://www.toymoban.com/news/detail-486229.html
到了这里,关于Docker 生成 golang 程序镜像的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!