使用Docker进行golang项目服务

5f0d552i  于 2022-11-22  发布在  Docker
关注(0)|答案(2)|浏览(168)

我想用docker来做一个个人项目,我建立了它,它是用go few services编写的。所以一开始我的“体系结构”是把每个服务拆分到不同的文件夹中每个服务都有自己的main,它启动服务,初始化它所需要的,为它打开一个特定的端口。到目前为止一切都很好。所以我想用docker,所以当我开始阅读到它的时候,我想为每个服务引入docerfile。但由于我使用了组合的go.mod文件,所以无法构建Docker映像。
所以我的问题是如何为这类东西的正确架构,我应该为每个服务引入新的go.mod文件,还是以某种方式使用组合的go.mod,这是整个项目,但以某种方式分割所有的服务,以单独部署有自己的端口和东西.我是新的docker,所以我在寻找建议,这类东西应该如何构建?
我在看一段视频,视频中有人解释说,每个服务都应该有自己的go.mod,但我在看一些开源项目,在我看来,他们只使用一个go.mod文件,而且不知何故,仍然将服务作为不同的服务部署。

nhhxz33t

nhhxz33t1#

这取决于你想要构建和部署它的方式。在我的公司,我们使用一个mono repo,在cmd文件夹中使用相同的go.mod文件来提供不同的服务。

# Accept the Go version for the image to be set as a build argument.
ARG GO_VERSION=1.19

# First stage: build the executable.
FROM golang:${GO_VERSION}-alpine

# Install the Certificate-Authority certificates for the app to be able to make
# calls to HTTPS endpoints.
# Git is required for fetching the dependencies.
RUN apk add --no-cache bash ca-certificates openssh build-base curl

RUN go env -w GO111MODULE=on && \
    go env -w GOFLAGS=-buildvcs=false

# Set the working directory outside $GOPATH to enable the support for modules.
WORKDIR /src

RUN go install github.com/jteeuwen/go-bindata/... && \
    go install github.com/cortesi/modd/cmd/modd@latest

Docker合成文件:

version: "2.4"

x-build:
  &build
  build:
    context: .
    dockerfile: <your-docker-folder>>/Dockerfile
  entrypoint: modd
  command: -f modd.conf
  volumes:
    - gopath:/go
    - ./:/<your-source-folder>
  environment:
    <<: *env
  networks:
    - your-network

services: 
  fast-api:
    <<: *build
    container_name: your-service-name
    ports:
      - "8080:8080"

这个项目使用的是https://github.com/cortesi/modd,它是一个灵活的开发工具,可以运行进程并响应文件系统的更改,当使用docker进行本地开发时,您可以受益于热加载,但我们正在为新项目使用https://github.com/cosmtrek/air
我希望我能帮助你。我会继续寻找这个线程,看看你是否可以解决你的问题。
祝你好运

nszi6y05

nszi6y052#

您可以使用单个go.mod文件,并且仍然为docker构建不同的服务可执行文件。如果服务更像单个项目而不是独立的可发布模块,那么单个go.mod就有意义了。
通过指定主文件名而不是.或./...,您将能够为不同的服务构建可执行文件
例如,对于服务目录为

├── go.mod
├── go.sum
├── m1
│   ├── m1_code.go
│   └── cmd
│       └── m1_main.go
├── m2
    ├── m2_code.go
    └── cmd
        └── m2_main.go

m1的Dockerfile可以如下所示,m2的Dockerfile也是如此。

FROM golang:alpine AS builder

RUN mkdir /app
WORKDIR /app

COPY go.mod . 
COPY go.sum .
RUN go mod download

ADD . /app
RUN go build -o main_m1 ./m1/cmd/main.go  

FROM alpine:latest AS production 
COPY --from=builder /app/main_m1 .
ENTRYPOINT [ "./main_m1" ]

Dockerfile可以在m1、m2文件夹中,或者您可以使用带有构建参数的公共Dockerfile来指定main.go路径和输出文件名。

相关问题