jjzjj

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

coder 2024-07-05 原文

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

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/

有关go - Docker-Compose:与需要相对导入的 Dockerfiles 组合的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

  3. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  4. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

  5. ruby - 为什么在 ruby​​ 中创建 Rational 不需要新方法 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?

  6. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  7. ruby-on-rails - 需要帮助最大化多个相似对象中的 3 个因素并适当排序 - 2

    我需要用任何语言编写一个算法,根据3个因素对数组进行排序。我以度假村为例(如Hipmunk)。假设我想去度假。我想要最便宜的地方、最好的评论和最多的景点。但是,显然我找不到在所有3个中都排名第一的方法。Example(assumingthereare20importantattractions):ResortA:$150/night...98/100infavorablereviews...18of20attractionsResortB:$99/night...85/100infavorablereviews...12of20attractionsResortC:$120/night

  8. ruby - 我需要从 facebook 游戏中抓取数据——使用 ruby - 2

    修改(澄清问题)我已经花了几天时间试图弄清楚如何从Facebook游戏中抓取特定信息;但是,我遇到了一堵又一堵砖墙。据我所知,主要问题如下。我可以使用Chrome的检查元素工具手动查找我需要的html-它似乎位于iframe中。但是,当我尝试抓取该iframe时,它​​是空的(属性除外):如果我使用浏览器的“查看页面源代码”工具,这与我看到的输出相同。我不明白为什么我看不到iframe中的数据。答案不是它是由AJAX之后添加的。(我知道这既是因为“查看页面源代码”可以读取Ajax添加的数据,也是因为我有b/c我一直等到我可以看到数据页面之后才抓取它,但它仍然不存在)。发生这种情况是因为

  9. ruby - 最多 n 的组合 - 2

    给定一个数组a,什么是实现其组合直到第n的最佳方法?例如:a=%i[abc]n=2#Expected=>[[],[:a],[:b],[:c],[:a,b],[:b,:c],[:c,:a]] 最佳答案 做如下:a=%w[abc]n=30.upto(n).flat_map{|i|a.combination(i).to_a}#=>[[],["a"],["b"],["c"],["a","b"],#["a","c"],["b","c"],["a","b","c"]] 关于ruby-最多n的组合,我

  10. ruby - 需要重构为新的 Ruby 1.9 哈希语法 - 2

    这个问题在这里已经有了答案:HashsyntaxinRuby[duplicate](1个回答)关闭5年前。我有一个Recipe,其中包含以下未通过lint测试的代码:service'apache'dosupports:status=>true,:restart=>true,:reload=>trueend失败并出现错误:UsethenewRuby1.9hashsyntax.supports:status=>true,:restart=>true,:reload=>true不确定新语法是什么样的...有人可以帮忙吗?

随机推荐