copilot pipelineで作ったCI が「COMMAND_EXECUTION_ERROR Message: Error while executing command: for workload in $WORKLOADS」で FAILする
これについて。
copilot pipelineで作ったCIがコケてたのだけどやっと原因がわかった。「When using COPY with more than one source file, the destination must be a directory and end with a /」まさかここで以降のプロセスがコケてたとは思わなんだ。ただのwarningかと #aws #copilot
— yuto (@jacoyutorius) 2021年6月21日
ここ最近 copilot cliが楽しくて、ドキュメント流し見してチュートリアル試して、手元のDockerイメージをデプロイして、、といった感じで遊んでいた。
AWS App Runner がリリースされたことで、コンテナイメージデプロイがとーーーーーーっってもカジュアルにできるようになった。
で、App RunnerでもGithubへのpushをフックして自動デプロイなんてことはやってくれるのだけど、もうちょっと実戦での運用を考えたときに、CI/CDの環境があったほうが便利。copilot ならコマンド一発でそれができる。
copilot pipeline
コマンドを叩くとCodePipelineによるCI/CD環境を作ってくれる。
さて、そこでお試しで作ったSinatraアプリケーションを copilot でパイプラインを作ってデプロイしようとした。
copilot pipeline init
このコマンドを実行すると、プロジェクトディレクトリ内に pipeline用のファイルが生成される。
$ tree . ├── Dockerfile ├── Gemfile ├── Gemfile.lock ├── README.md ├── app.rb ├── copilot │ ├── buildspec.yml # これと │ ├── pipeline.yml # これ │ └── sinatra-svc │ └── manifest.yml └── views └── index.erb 3 directories, 10 files
んで、その2つのファイルをGithubにpushして、
copilot pipeline update
とやると、CodeBuild/CodePipelineの環境が構築され、デプロイが走る。
はずなのだが。
自分で作ったDockerイメージだと、pipeline の途中で以下のようなエラーが出て FAILしてしまうのでした。
[Container] 2021/06/20 18:24:37 Phase complete: POST_BUILD State: FAILED [Container] 2021/06/20 18:24:37 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: for workload in $WORKLOADS; do
問題となったDockerfileはこちら。
FROM ruby:3.0.0-alpine WORKDIR /app COPY Gemfile* . COPY app.rb . COPY views/ ./views RUN bundle install1 EXPOSE 80 CMD ["bundle", "exec", "ruby", "app.rb"]
ローカルでは問題なくビルドできるし、App Runnerへのデプロイは成功しているのに何が原因なのか。。。?
copilotが自動で作ってくれる buildspec.yml
にはコンテナイメージをビルドしてECRにpushする、という一連の流れがインラインで書かれているのだけど、その処理中にエラーが起きていたため、どの行でエラーになっているのが調べるのに時間がかかった。
50行くらいのスクリプトにちまちま printfデバッグを仕掛けて(シェルスクリプトなんでechoですけど)やっと原因がわかった。
結局、ただの warningだと思ってスルーしていた Dockerfileの記述が原因だったらしい。
Step 3/8 : COPY Gemfile* . When using COPY with more than one source file, the destination must be a directory and end with a /
COPY
でファイルをコンテナイメージへコピーする際には、コピー先のディレクトリ名の末尾に /
を付けてやる必要がある、と。
以下のように修正して無事デプロイできるようになったのでした。