Docker 生成 golang 程序镜像

一. 准备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

报错

Docker 生成 golang 程序镜像_第1张图片

查找原因网上说是因为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 生成 golang 程序镜像_第2张图片

 

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

可以看到已经运行起来

六.  请求服务接口

Docker 生成 golang 程序镜像_第3张图片

Docker 生成 golang 程序镜像_第4张图片 可以看到已经通了

 

你可能感兴趣的:(golang,java,android)