go - Docker-Compose:与需要相对导入的 Dockerfiles 组合

标签 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 目录公开的公共(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 buildgo get -d -v 上失败并出现错误:

package myproj/commons1: unrecognized import path "myproj/commons1" (import path does not begin with hostname)

如果 myproj/commons1 被复制到 /go/src/,那么这应该不是问题吧?我猜那时候它还没有被复制?

最佳答案

您可以构建一个包含 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/

缺点是每当您更新其中一个公共(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/

相关文章:

postgresql - 如何将 pq.Int64Array 转换为字符串?

pointers - 指向 Golang 中的结构

docker-pr proc 已经在监听端口 80?在 Ubuntu 上使用 snappy 安装 docker

docker - 私有(private) Docker 注册表 : 'x509: certificate signed by unknown authority' only for Windows images

mysql - docker 撰写 : The server requested authentication method unknown to the client

python - golang 和 python 的 Dockerfile

go - 为什么golang中的关键字范围适用于2d slice ?

docker - Docker可以绑定(bind)多个文件夹吗?

visual-studio - Visual Studio 无法创建 docker 图像

python - 为什么找不到Dockerfile?