在单个 Docker 容器中运行前端和后端

Kel*_*n 2 go docker vue.js

我知道最好的做法是始终将前端和后端代码分开。我有一个 Vue js 应用程序和一个 Golang 服务器来执行一些业务逻辑,我需要它们成为一个可以从单个容器运行的单元。有什么建议吗?

非常感谢

col*_*tor 5

使用多阶段 Dockerfile确保您只复制所需的资产。使用scratch图像还可以显着减少图像占用空间

例如,以下多阶段构建将 VueJS 构建到dist目录和单个 Go 二进制文件中,并将它们复制到最小scratch图像:

# go build
FROM golang:1.16.3 AS go-build

WORKDIR /
COPY    backend backend
RUN     CGO_ENABLED=0 go build

# node build
FROM node:15.13.0 AS node-build

WORKDIR /
COPY frontend frontend
RUN \
    npm i && \
    npm run build

#
# final stage:
#
FROM scratch

COPY --from=go-build \
    /backend/rest-server \
    /app/rest-server

COPY --from=node-build \
    /frontend/dist \
    /app/dist/

CMD ["/app/rest-server"]
Run Code Online (Sandbox Code Playgroud)

在上面的示例中,您的 REST 服务不仅会为您的后端 API 提供服务,还会为目录中构建的静态 VueJS 前端资源提供服务/app/dist

h.Handle(
    "/",
    http.StripPrefix(
        "/",
        http.FileServer(
            http.Dir(conf.StaticDir), // e.g. VueJS's "/app/dist"
        ),
    ),
)
Run Code Online (Sandbox Code Playgroud)