首先,这是我的项目层次结构:
myproj/
- commons1/
- com1_file1.go
- ...
- commons2/
- com2_file1.go
- ...
- module1/
- mod1_file1.go
- Dockerfile
- ...
- module2/
- mod2_file1.go
- Dockerfile
- ...
- docker-compose.yml
我想做的是,当 module1
和 module2
容器启动时,它们每个都有一份所有 commonsN
GOPATH
中的目录,这样每个目录都可以访问每个 commonsN
目录公开的公共(public)库。
例如,我希望在 module1
的容器中看到这样的内容:
/go/
- src/
- commons1/
- com1_file1.go
- ...
- commons2/
- com2_file1.go
- ...
- module1/
- mod1_file1.go
- ...
原因是这基本上是我本地 GOPATH
的样子(当然还有其他模块)所以我可以在我的源文件中做这样的事情:
package main
import(
"fmt"
"myproj/commons1"
)
func main() {
fmt.Println("Some thing from common library :", commons1.SomethingFromCommons)
}
从我对 Docker 的天真理解来看,似乎不允许我修改我的 Dockerfile 来执行 COPY ../commons1/go/src/commons1
的操作,所以我'我想知道我将如何着手完成这个?
我强烈不希望走 Github 路线,因为源代码都在公司代理和诸如此类的东西后面,而且我想象配置所有这些将比简单地复制一些目录花费更长的时间。
编辑
根据 barat 的建议,我更新了我的 docker-compose.yml
文件,看起来像这样:
version: '2'
services:
module1:
volumes:
- ./commons1:/go/src/myproj/commons1
build: module1/
module1
的 Dockerfile 如下所示:
FROM golang:1.8.0
RUN mkdir -p /go/src/app
WORKDIR /go/src/app
COPY . /go/src/app
RUN go get -d -v
RUN go install -v
ENTRYPOINT /go/bin/app
EXPOSE 8080
docker-compose build
在 go get -d -v
上失败并出现错误:
package myproj/commons1: unrecognized import path "myproj/commons1" (import path does not begin with hostname)
如果 myproj/commons1
被复制到 /go/src/
,那么这应该不是问题吧?我猜那时候它还没有被复制?
最佳答案
您可以构建一个包含 commons1
和 commons2
的图像,您的其他图像基于该图像。
FROM golang:1.8.0
RUN mkdir -p /go/src/myproj/commons1 && mkdir -p /go/src/myproj/commons2
COPY commons1/ /go/src/myproj/commons1/
COPY commons2/ /go/src/myproj/commons2/
缺点是每当您更新其中一个公共(public)项目时,这都需要一个外部构建步骤:
docker build -t me/myproj:commons .
然后您的 compose 应用程序可以依赖公共(public)图像而不是 golang
并在没有卷的情况下正常构建。
FROM me/myproj:commons
...
关于go - Docker-Compose:与需要相对导入的 Dockerfiles 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42614704/