0

我正在 docker 中使用 Go 和 Glide 构建一个应用程序。我还必须使用反射来自动触发编译。

我不知道如何让 Glide 与 docker 一起工作。

Dockerfile

FROM golang:1.8.1-alpine

ENV GOBINARIES /go/bin
ENV BUILDPATH /code
ENV REFLEXURL=http://s3.amazonaws.com/wbm-raff/bin/reflex1.8a
ENV REFLEXSHA=19bdbbb68c869f85ee22a6b7fa9c73f8e5b46d0fe7a73df37e028555a6ba03e8

WORKDIR $GOBINARIES
RUN rm -rf /var/cache/apk/*
RUN wget -q "$REFLEXURL" -O reflex
RUN chmod +x /go/bin/reflex

ENV TOOLS /go/_tools

RUN mkdir -p $BUILDPATH
ENV PORT 5000
EXPOSE $PORT

RUN mkdir -p $TOOLS
ADD build.sh $TOOLS
ADD reflex.conf $TOOLS
RUN chown root $TOOLS/build.sh
RUN chmod +x $TOOLS/build.sh

WORKDIR $BUILDPATH
CMD ["reflex","-c","/go/_tools/reflex.conf"]

构建.sh

set -e
echo "[build.sh:building binary]"
cd $BUILDPATH
glide install -s -v
go build -o /servicebin && rm -rf /tmp/*
echo "[build.sh:launching binary]"
/servicebin

反射配置文件

-sr '\.build$' -- sh -c '/go/_tools/build.sh'

docker-compose.yaml

version: '3'
services:
  logen:
    build:
      context: ./Docker
      dockerfile: Dockerfile
    ports:
    - "5000:5000"
    volumes:
    - .:/code

Atom on-save 插件配置文件

[
  {
    "srcDir": ".",
    "destDir": ".",
    "files": "**/*.go",
    "command": "echo $(date) - ${srcFile} > .build"
  }
]

main.go

package main

import (
    "io"
    "log"
    "net/http"
    "os"
  "github.com/astaxie/beego"
)

func hello(w http.ResponseWriter, r *http.Request) {
    io.WriteString(w, "Hello world!1")
}

func main() {
    log.SetOutput(os.Stdout)

    port := ":" + os.Getenv("PORT")
    http.HandleFunc("/", hello)

    log.Printf("\n Application is listening on %v\n", port)

    http.ListenAndServe(port, nil)
}

在此处输入图像描述

4

1 回答 1

0

实际上,我不需要在容器中安装 Glide!只需将主机中的供应商文件夹反映到 docker-compose.yml 中的 $GOPATH/src 即可。然后编译就OK了。

version: '3'
services:
  logen:
    build:
      context: ./Docker
      dockerfile: Dockerfile
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - ./vendor:/go/src
于 2017-04-13T22:19:19.543 回答