docker 发布一个完整golang后端服务

写在前面,由于docker学了好久没有用,忘得差不多了,发布花了两天多,主要的坑是使用了golang:1.16-alpine这个镜像,单独使用dockerfile打包没有问题;使用多阶段打包,会报错找不到文件或者路径

  • 解决方式1: alpine上应该使用网络编译go,需要增加 -tags netgo。GOOS=linux GOARCH=amd64 go build -tags netgo -o rollingupdate${TAG} main.go
  • 解决方式2: 使用 golang:1.16镜像,去掉alpine

我的golang项目目录

捕获.PNG

1.创建 Dockersfile文件,用来编译项目,打包

##
## Build
##
FROM golang:1.16 AS build

WORKDIR /app

RUN go env -w GOPROXY=https://goproxy.cn,direct

COPY . .

RUN go mod download

RUN GOOS=linux CGO_ENABLED=1 GOARCH=amd64 go build -o /gin-admin

##
## Deploy
##

FROM fssq/distroless_base-debian10
# FROM scratch

WORKDIR /

# 复制编译后的程序
COPY --from=build /gin-admin /gin-admin
# 复制配置文件
COPY configs /configs

EXPOSE 8080

ENTRYPOINT ["/gin-admin"]
  • 1.1分为两个阶段 BuildDeploy ;
  • 1.2引入cgo ,需要 CGO_ENABLED=1

2.创建docker-compose.yml 将多个关联引用整合在一起,主要用到数据库redis

version: "3.7"
services:
  app:
    build: .
    ports:
      - "8080:8080"
    links:
      - postgres
      - redis

  postgres:
    image: "postgres:alpine"
    environment:
      POSTGRES_DB: "gin-admin"
      POSTGRES_PASSWORD: 123456
    volumes:
      - pgdata:/var/lib/postgresql/data

  redis:
    image: "redis:alpine"
    volumes:
      - rddata:/data

volumes:
  pgdata:
  rddata:


  • 2.1 app 是自己的应用 ,build 会执行Dockersfile
  • 2.2 postgres sql数据库
  • 2.3 redis
  • 2.4 访问同一容器其他服务网络,可以使用 networkslinks
    将三个应用整合成一个服务,后续直接部署

3. 打包镜像

3.1 打包并运行

docker-compose up -d

3.2 只打包

docker-compose build

你可能感兴趣的:(docker 发布一个完整golang后端服务)