2017-03-05 41 views
0

首先Dockerfiles作曲,这是我的项目层次:多克尔 - 撰写:与需要相对进口

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

我想要做的是,当module1module2容器启动时,他们每个人都有GOPATH的所有commonsN目录的副本,以便每个目录都可以访问由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) 
} 

从我泊坞窗天真理解,似乎我不能改变我的Dockerfiles沿的线做一些事情,所以我想知道如何去完成这个?

我强烈希望不要去Github路由,因为源代码都在公司代理之后,而且我想象的是配置所有这些将比仅仅复制一些目录更长。

编辑 我已经更新了我的docker-compose.yml文件,看起来每建议像这样从BARAT:

version: '2' 

services: 
    module1: 
     volumes: 
      - ./commons1:/go/src/myproj/commons1 
     build: module1/ 

Dockerfile为module1看起来是这样的:

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/,那么这不应该是一个问题吗?我猜,那么它还没有被复制过呢?

+0

但在泊坞窗,构成可以绑定贴装您的主机卷/目录... https://docs.docker.com/compose/compose-file/#volumes-volumedriver – barat

+0

好了啊,我读了但我不完全确定这是如何工作的。我是否只需在撰写文件中的'volumes'下添加一行如'./commons1:/ go/src/commons1'作为音量? – rawa

+0

是 - 左边部分(之前:)是您的主机路径,右边部分(之后:)定义容器内的装载点。你可以使用多个:) – barat

回答

0

所以问题是go get -d -v命令,因为它基本上是抱怨myproj/commons1没有安装在$GOPATH/src。当然,犯罪嫌疑人的这我是因为码头工人撰写并没有安装我之前提到的它跑docker-compose buildgo get所以我在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 build,我的Go二进制文件在每次执行docker-compose up时都会重建。

这也是有问题的,因为我想为某些容器使用dockerize等待另一个容器完全启动,现在我认为它变得非常混乱。

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 
...