将包含Golang的网络应用程序部署到Beanstalk,其中包含供应商
如果不正确设置文件夹结构,就会陷入困境。
-
- vendoringも含めた本格ウェブアプリのデプロイは、フォルダ構成とかちゃんとしとかないとハマります・・・
-
- 自分で書いたコードをどこに置くか、vendorをどこに置くか
- その上でDockerfileをどう書くとスムーズにデプロイしてくれるか
我会将诸如此类的事情总结一下。
我已经成功地将以下内容与IntelliJ开发环境配合使用。
- GolangのウェブアプリをBeanstalkへデプロイする環境をなるはやで作る(Mac版)
项目文件夹结构
-
- ソースファイルを$GOPATH/ドメイン名/パッケージ名の下に置くのは鉄則!
-
- 今回は、$GOPATH/example.jp/sample1/とします
- 自分はプロジェクトツリーは以下のようにしています
$GOPATH/example.jp/sample1/的布置
ファイル or ディレクトリ説明app/自分で書いたgoファイルを置く場所。サブディレクトリからなるvendor/github.com/hoge/fugaなどサードパーティ製のvendoringしたいものを置くtemplate/テンプレートファイル。app/の中に入れても良い。お好みでassets/画像やjs、cssなど静的ファイル置き場。これもapp/の中に入れても良いmain.gomain()を含むアプリ実行の拠点DockerfileDockerコンテナをビルドするためのお馴染みファイルDockerrun.aws.json起動ポートなどを指定.ebextensionsBeanstalk環境への追加設定
以下是部署所需的所有目录或文件。.ebextensions 文件用于指定文件上传上限,因此在实际上是必需的。
在 Beanstalk + Docker 中,在上传过大文件时出现了无法上传的问题。
除此之外,我会在下面的文件夹中创建并放置。
ファイル or ディレクトリ説明dev/開発でのみ必要なものを入れるdev/script/スクリプトファイル置き場dev/gulp/.coffeeや.scss置き場。ここからgulpでall.js、all.cssを作って、assetsへコピーしたりする
无论如何,这些在部署时都是不必要的。
卖家/被安置的地方
-
- オープンソースなサードパーティ製パッケージは、go getで最新を得るのではなく、バージョンを固定しておきたい場合があります
-
- これらはvendor/へ配置します
-
- git submoduleで配置すると良いでしょう
- 仮にgithub.com/Sirupsen/logrusパッケージをサブモジュールとしてvendorに配置する場合、以下のようにgit submoduleコマンドを叩きます
git sumodule add https://github.com/Sirupsen/logrus.git vendor/github.com/Sirupsen/logrus
Dockerfile的含义是什么?
#
# golang:1.6-onbuildではないことに注意。onbuildだとうまくいかないかも・・・
#
FROM golang:1.6
#
# vendoringせずgo getで得る依存パッケージをつらつらと書く
#
RUN go get github.com/golang/protobuf/proto
RUN go get golang.org/x/text/currency
RUN go get golang.org/x/image/draw
RUN go get golang.org/x/image/bmp
RUN go get golang.org/x/image/tiff
RUN go get golang.org/x/net/context
RUN go get gopkg.in/go-playground/validator.v8
RUN go get gopkg.in/yaml.v2
#
# golang:1.6で$GOPATHとなっている/go/以下へ必要なファイルとディレクトリを配置
# ドメイン/パッケージ名は、ローカル開発環境と一致するようにすることが大事
#
ADD app /go/src/example.jp/sample1/app
ADD assets /go/src/example.jp/sample1/assets
ADD vendor /go/src/example.jp/sample1/vendor
ADD main.go /go/src/example.jp/sample1/main.go
EXPOSE 5000
WORKDIR "/go/src/example.jp/sample1/"
CMD ["go", "run", "main.go"]
Dockerrun.aws.json文件
根据Dockerfile的要求,指定端口为5000。
{
"AWSEBDockerrunVersion": "1",
"Ports" : [{ "ContainerPort": "5000" }]
}
HTTP和HTTPS的请求将通过此方式流向在Docker容器中运行的网络应用程序 main.go 所监听的5000端口。
将要部署的文件以zip格式压缩。
使用`eb deploy`命令进行部署,默认情况下会上传由git归档生成的zip文件。然而,由于缺少git子模块,导致部署目标上的构建失败。
你应该使用自己的脚本将文件打包为zip,然后使用eb deploy命令进行部署。
- Elastic Beanstalkにgit submoduleの内容を含めてデプロイする
这次我们将按照以下方式创建一个zip文件。
zip -r deploy.zip Dockerfile Dockerrun.aws.json main.go app assets vendor template .ebextensions
因为一个一个打很麻烦,所以可以把它们放在一个Shell脚本中,在上述步骤之后执行eb deploy会更方便。
将以下行添加到项目根目录下的.elasticbeanstalk/config.yml文件中。
deploy:
artifact: deploy.zip
部署
一旦到了这个地步,
$ eb deploy
只要努力,就应该能行!祝你成功。