1 回答
TA贡献1829条经验 获得超13个赞
为此,您需要四个单独的 Dockerfile,才能启动四个具有四个不同程序的独立容器。Go 组件多克文件可以相当简单:
# 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
(如果除了正在构建的特定命令目录之外,这三个映像实际上是相同的,您也可以将其作为传递。我假设这些包需要源目录中其他位置的包,如 a 或其他任何内容,这将要求 Dockerfile 位于顶层。ARG./cmd/server/*./pkg/support
由于您的脚本只运行这四个程序,我通常建议使用 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 upCtrlCaccountseventsplaceshttp://accounts/graphql
您还可以按原样调整启动器脚本。运行而不是构建映像,启动容器(可能具有固定的 s)来停止它们。您应该使用网络和它们上的所有容器,以便它们可以以与撰写设置相同的方式进行通信。docker buildgo builddocker run--namedocker stop && docker rmdocker network createdocker run --net
- 1 回答
- 0 关注
- 52 浏览
添加回答
举报