需要帮助在 Go 工作区(多模块)模式下创建 Docker 容器

Ham*_*eed 7 go multi-module docker docker-compose

我需要帮助,我正在 go 工作区中工作,工作区中有多个使用通用功能的项目。因此,我所做的是制作一个单独的模块,其中包含其他模块使用的所有常用功能。

\n

当我们使用 go 工作区时,所有模块都可以共享它们的代码。

\n

文件结构如下:

\n
Workspace\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Project1\n\xe2\x94\x82      \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.go\n\xe2\x94\x82      \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 docker-compose.yml\n\xe2\x94\x82      \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Dockerfile\n\xe2\x94\x82      \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 go.mod\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Project2\n\xe2\x94\x82      \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.go\n\xe2\x94\x82      \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 docker-compose.yml\n\xe2\x94\x82      \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Dockerfile\n\xe2\x94\x82      \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 go.mod\n\xe2\x94\x82\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 Common\n\xe2\x94\x82      \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 functionality.go\n\xe2\x94\x82      \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 go.mod\n\xe2\x94\x82\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 go.work\n
Run Code Online (Sandbox Code Playgroud)\n

common/functionality.goProject1 和 Project2通过将它们导入到项目中来使用其中的功能。

\n

当我运行docker-compose up -d命令时project1,它说您在项目中导入的公共模块不在 GOROOT 中。\n因为这里 docker 仅容器化目录中的文件Project1

\n

我怎样才能分别dockerizeProject1Project2???

\n

Bri*_*its 3

为了编译您的应用程序,编译器需要所有导入的包。当您构建 docker 映像时,context确定哪些文件可用;在你的情况下,这将是Project1(例如)。这意味着当您运行时,go build唯一Dockerfile可用的文件是Project1文件夹中的文件。编译器将检查工作区文件,但找不到(因为它不在上下文中)。

context您可以通过更改使其包含完整工作区来解决此问题,例如Project1/docker-compose.yml

project1:
    build:
      context: ../
      dockerfile: Project1/dockerfile
    environment:
      ....
Run Code Online (Sandbox Code Playgroud)

(您还需要更新您的文件Dockerfile,因为您将在子目录等中复制)。

然而,上面的内容并不是很理想(它在某种程度上违背了将项目放在单独文件夹中的目的)。根据您的发布过程,更好的选择可能是检查所有内容(例如,检查到 Git 存储库),执行操作go get -u(更新go.mod),然后构建 docker 映像(允许 go 从存储库检索依赖项)。