登录
首页 >  Golang >  Go问答

使用Docker在同一代码库中为多个服务器部署Golang应用程序的方法

来源:stackoverflow

时间:2024-03-01 15:45:24 176浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《使用Docker在同一代码库中为多个服务器部署Golang应用程序的方法》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

我有一个需要运行多个服务器的存储库。结构是这样的

// golang apps
- account = port 4001 
- event = port 4002
- place = port 4003

// node js
- gateway = port 4000

我通常使用这样的脚本在本地运行

// script.sh here:
#!/bin/bash

EnvAPP="${ENV_APP:-dev}"

function cleanup {
    kill "$ACCOUNTS_PID"
    kill "$EVENTS_PID"
    kill "$PLACES_PID"
}
trap cleanup EXIT

go build -tags $EnvAPP -o ./tmp/srv-accounts ./cmd/server/accounts
go build -tags $EnvAPP -o ./tmp/srv-events ./cmd/server/events
go build -tags $EnvAPP -o ./tmp/srv-places ./cmd/server/places

./tmp/srv-accounts &
ACCOUNTS_PID=$!

./tmp/srv-events &
EVENTS_PID=$!

./tmp/srv-places &
PLACES_PID=$!

sleep 1

node ./cmd/gateway/index.js

我是否可以为此案例创建一个 dockerfile 到生产中?对于这种情况,我应该运行 dockerfile 中的 script.sh 吗?我应该在 dockerfile 中使用该图像怎么样?我不知道使用 docker 的这种情况,因为运行多个服务器的一个代码库,而且问题还在于运行的服务器端口

也许你们中有人遇到过这种情况?很高兴知道如何解决这个问题

在本例中我使用 graphql federation (go),因此我有多个服务和网关 (nodejs)

我想将其部署到生产中来解决这个问题


正确答案


为此,您需要四个单独的 dockerfile,以启动带有四个不同程序的四个单独的容器。 go 组件 dockerfile 可以相当简单:

# dockerfile.accounts
from golang:1.16 as build
workdir /app
copy . .
arg env_app=dev
run go build -tags "$env_app" -o /accounts ./cmd/server/accounts

from ubuntu:20.04
copy --from=build /accounts /usr/local/bin
cmd accounts

(如果除了正在构建的特定命令目录之外,这三个图像确实相同,您也可以将其作为 arg 传递。我假设 ./cmd/server/* 包需要位于其他位置的包您的源目录,例如 ./pkg/support 或其他目录,这需要 dockerfile 位于顶层。)

由于您的脚本仅运行四个程序,因此我通常建议使用 Docker Compose 作为一起启动四个容器的方法。 “启动一些具有已知选项的容器”是 compose 所做的唯一事情,但它会执行脚本执行的所有操作。

# docker-compose.yml
version: '3.8'
services:
  accounts:
    build:
      context: .
      dockerfile: Dockerfile.accounts
  events:
    build:
      context: .
      dockerfile: Dockerfile.events
  places:
    build:
      context: .
      dockerfile: Dockerfile.places
  gateway:
    build:
      context: .
      dockerfile: Dockerfile.gateway
      # (Since a Node app can't reuse Go code, this could also
      # reasonably be `build: cmd/gateway` using a
      # `cmd/gateway/Dockerfile`)
    ports:
      - 3000:3000

只需运行 docker-compose up 就会在前台启动所有四个容器;一旦启动,按 ctrl+c 将停止它们。您可以将网关配置为使用其他容器名称 accountseventsplaces 作为主机名;例如 http://accounts/graphql

您还可以按原样调整启动器脚本。运行 docker build 而不是 go build 来构建映像,运行 docker run 来启动容器(可能使用固定的 --names),运行 docker stop && docker rm 来停止它们。您应该 docker network 创建 网络,并 docker 运行 --net 上的所有容器,以便它们可以以与 compose 设置相同的方式进行通信。

今天关于《使用Docker在同一代码库中为多个服务器部署Golang应用程序的方法》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>