Docker-Compose:使用需要相对导入的Dockerfiles进行组合

时间:2017-03-05 22:12:21

标签: go docker docker-compose

首先,这是我的项目层次结构:

myproj/
    - commons1/
        - com1_file1.go
        - ...
    - commons2/
        - com2_file1.go
        - ...
    - module1/
        - mod1_file1.go
        - Dockerfile
        - ...
    - module2/
        - mod2_file1.go
        - Dockerfile
        - ...
    - docker-compose.yml

我想要做的是,当module1module2个容器启动时,它们每个都有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 buildgo get -d -v上失败并显示错误:

  

打包myproj / commons1:无法识别的导入路径" myproj / commons1" (导入路径不以主机名开头)

如果将myproj/commons1复制到/go/src/,那么这不是一个问题吗?我估计那时它还没有复制过吗?

2 个答案:

答案 0 :(得分:2)

您可以构建包含其他图片所基于的commons1commons2的图片。

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等到另一个容器完全启动,现在我认为它变得非常混乱。