2016年9月9日金曜日

elastic beanstalkでgolangのローカルインポートをなくすために、DockerでちゃんとADDしちゃおう的なお話

  • このエントリーをはてなブックマークに追加

elastic beanstalkでdeployするときに、
Dockerfile内でgo get githubのプライベートリポジトリはちゃんとsshやらなんやら設定しないとgetできないわけで。
そうなるとローカルインポートを使ってパッケージのインポートをしないといけないっていう。
けどそうするとなると、ファイルを分割したときにimportが相対パスでかなり面倒なわけで。
もちろんgolang自体シンプルな設計であるわけだからすごく深い階層でとかはないとは思うんだけど面倒だよねと。

ってことでローカルインポートにしないためにもDockerfileの設定をちゃんとしましょう的な。

FROM golang:1.7

# Set GOPATH/GOROOT environment variables
RUN mkdir -p /go
ENV GOPATH /go
ENV PATH $GOPATH/bin:$PATH

# go get all of the dependencies
RUN go get github.com/labstack/echo
RUN go get github.com/labstack/echo/engine/standard
RUN go get github.com/labstack/echo/middleware

# add local package
ADD . /go/src/github.com/your/private_repo

# Set up app
ADD . /app

EXPOSE 3000

CMD ["go", "run", "/app/main.go"]

なんか二度手間といえば二度手間感があるけれども、
こうすることによりちゃんとpackageとしてgithub.com配下に入るから、
ちゃんとgithub.com/...としてパッケージインポートできるっていう。
srcの中の適正なディレクトリにADDをして、/appにもADDするみたいな。
多分CMDをする場所をgithub.com/なんちゃらみたいにすれば、
わざわざADD . /appする必要はないんだろうけどどうだろうみたいな。

/
 |- go/
     |- bin/
     |- pkg/
     |- src/
          |- github.com/
                 |- labstack/
                 ...
                 |- your/
                      |- private_repo/
                            |- main.go
                            |- hoge.go
 |- app/
     |- main.go
     |- hoge.go

deployしたときには、こんな感じのフォルダ構成になるかと。
ってな感じでこうやってあげればローカルインポートじゃないから「local import "***" in non-local package」っていうことは出てこないよ的なみたいな。

Adsense