首先,这是我的项目层次结构:
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
目录公开的公共库。
例如,我希望在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的天真理解,似乎我不允许修改我的Dockerfiles以执行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
上失败并显示错误:
打包myproj / commons1:无法识别的导入路径" myproj / commons1" (导入路径不以主机名开头)
如果将myproj/commons1
复制到/go/src/
,那么这不是一个问题吗?我估计那时它还没有复制过吗?
答案 0 :(得分:2)
您可以构建包含其他图片所基于的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/
缺点是,每当您更新其中一个常见项目时,这需要外部构建步骤:
docker build -t me/myproj:commons .
然后您的撰写应用程序可以依赖于公共图像而不是golang
,并且在没有卷的情况下正常构建。
FROM me/myproj:commons
...
答案 1 :(得分:0)
问题是go get -d -v
命令,因为抱怨myproj/commons1
基本上没有安装在$GOPATH/src
中。我当然怀疑是因为Docker Compose没有在我go get
上运行docker-compose build
之前安装我提到的卷,所以我在docker-compose.yml
做了一个解决方案,但它远离优雅:
version: '2'
services:
module1:
volumes:
- ./commons1:/go/src/myproj/commons1
build: module1/
ports:
- "8080:8080"
command: bash -c "go get -d -v && go install -v && /go/bin/app
这显然远非理想,因为无论我是否运行docker-compose up
,每次执行docker-compose build
时都会重建我的Go二进制文件。
这也有问题,因为我想让某些容器使用dockerize
等到另一个容器完全启动,现在我认为它变得非常混乱。