at backyard

Color my life with the chaos of trouble.

AWSのCodeBuildで"layer does not exist"というエラーが出たとき

"failed to export image: failed to create image: failed to get layer sha256:xxx: layer does not exist" というエラーで落ちる

ある日、AWSのCodeBuildが失敗した。
失敗前の修正でDockerfileを修正していたため、この変更が引き金になっていたのは明確だった。

ただ、エラーの内容が "failed to export image: failed to create image: failed to get layer sha256:xxx: layer does not exist" というものだったため、最初原因がわからず悩んだ。

そしてエラーで落ちる箇所が Dockerfile内でCOPY している箇所で落ちるというものだった

問題の解決のために参照したissueが下記となる。

github.com

自身の英語力の関係上、このissueをまだ深く読み解けたわけではないのだが、 どうやら原因としてはCOPYコマンドの挙動に問題があるようだ。

整理すると

  • AWS の CodeBuild で使用されているDocker環境が COPY コマンドに問題があるバージョンのよう
  • その環境で COPY コマンドを2度続けて実行したため failed to export image: failed to create image: failed to get layer sha256:xxx: layer does not exist" というエラーが発生していた

という形になる。

ただ以前もCOPYコマンドは同じように書いていたが、なぜ今回エラーになったのか?
ちょうどこのタイミングで使用するdocker imageをamazon linuxのv1からamazon linux v2に変えたことが原因としてありそうだ。

結果としては、COPYコマンドを2回続けて書いていた箇所を削除し、一つのCOPYで済ませるように変更することでこの問題は解決した。

ちなみにCodeBuildで動かす前にローカル環境(macOS)でdocker buildはしており、こちらは問題なく成功している。
ということは、ローカル上のDocker環境では問題ないということになる。

CodeBuildで動いているランタイムがたまたまこの問題を引き起こすものになっていたということだろうか。

docs.aws.amazon.com

AWS CodeBuildをローカル環境で試す

なお、AmazonはCodeBuildのDocker imageをDocker Hubで公開しているようだ。

https://hub.docker.com/r/amazon/aws-codebuild-local/

こちらは試していないが、もしこれで同じ環境でテストできるようなら、これは嬉しいところ