通过复制供应商文件夹来构建golang

时间:2017-12-20 10:06:49

标签: docker go

我的项目结构

/github.com/user
 - libraries
 - services
     - service-api-signup
          - Dockerfile
          - main.go
     - service-api-second
          - ...
 - vendor

service-api-signup中的Docker文件

FROM golang
COPY . /go/src/github.com/user/services/service-api-signup

# need to copy all the dependencies on vendor to /go/src/github.com/..

如何将所有依赖于供应商和库文件夹的依赖项复制到docker image上构建的路径? (需要从父目录复制并构建)

任何设置我的开发环境的方法?

感谢。

2 个答案:

答案 0 :(得分:1)

通常的方法是使用依赖关系管理器,例如dep

另一种方法是直接在Dockerfile中复制供应商目录,但这并不理想,因为它会逐字复制整个供应商目录,即使它包含旧的或未使用的导入。

答案 1 :(得分:0)

假设您有一种monorepo设置,供应商位于顶层,然后是每个子目录(/ services)中的dockerfiles,您可以使用顶级docker-compose.yml文件(docs)定义所有服务,然后使用卷装置确保供应商最终进入容器内。

举个例子

.../repo
 - libraries
 - services
     - service-api-signup
          - Dockerfile
          - main.go
     - service-api-second
          - ...
 - vendor
 - docker-compose.yml

docker-compose.yml看起来像:

version: '3'
services:
  service-api-signup:
    container_name: api-signup
    build:
      context: ./service-api-signup
    volumes:
      - ./vendor:/go/src/github.com/user/services/service-api-signup/vendor
  service-api-second:
    container_name: api-second
    build:
      context: ./service-api-second
    volumes:
      - ./vendor:/go/src/github.com/user/services/service-api-second/vendor

还有一个选项可以覆盖dockerfile的命令和入口点,允许您在通过docker-compose运行时将自定义脚本设置为入口点

entrypoint: /go/src/github.com/user/services/service-api-signup

也许那个脚本(您需要在某处创建并放入您的仓库)可以使用像gin这样的实时重新加载工具,可能看起来像:

#!/bin/bash

go get github.com/codegangsta/gin

exec gin --immediate -appPort 8080 run

这仍然意味着你正在docker中构建应用程序(在OS中不是linux的应用程序将意味着更糟糕的性能)。但它确实意味着你获得了docker-compose方便,实时重载并且不需要重建容器。