Amazon LinuxのDockerでDocker Hubとの通信に失敗する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

ども、大瀧です。 DockerをAmazon Linuxで実行していると、docker pushdocker pullの実行で度々社内でトラブルになることがあります。なんてことはないバグなのですが、Amazon Linux特有のため知名度が低いので、備忘録を兼ねて現象と対処方法をここにまとめておきます。

症状

例えば、以下のようにDocker HubにDockerイメージをPushしようとすると、400エラーになります。

$ docker push takipone/ubuntu:latest
The push refers to a repository [takipone/ubuntu] (len: 1)
6d4946999d4f: Image already exists
9fd3c8c9af32: Image successfully pushed
435050075b3f: Image successfully pushed
428b411c28f0: Image successfully pushed
FATA[0048] Error pushing to registry: Server error: 400 trying to push takipone/ubuntu:latest manifest
$

Push以外にPullでも同様の400エラーの報告がありました。また、Docker Hub以外にDocker Registry v2(Docker Distribution)でも報告があります。Push時の特徴としては、断片化された個々のイメージのアップロードは順調に進み、最後のマニフェストの登録で400エラーになる残念な挙動があります。404や403ではなく、400エラーというのも目立ちますね。

対処方法

Amazon LinuxのDockerパッケージのバージョン1.6.0-1.5.amzn1で修正されたバグに起因するものです。バージョン1.6.0-1.3.amzn1以下の場合は、yum updateでバージョンを上げましょう。Amazon Linuxのパッケージ特有のようなので、他のディストリビューションのdockerパッケージは問題なさそうです。

Docker本体には関係なさそうなのですが、とばっちり(苦笑)で上げられたGitHubのIssueが詳しいです。

ややこしいのが、DockerをサポートするマネージドサービスであるBeanstalkとECS(EC2 Container Service)の場合です。適宜Solution Stackのアップデートやyum updateの実行を検討しましょう。Dockerパッケージの対象バージョンに対応するSolution StackやAMIを以下に示します。

  • Elastic Beanstalk Docker/Multi-container Dockerの対応バージョン(v1.4.0以前がアップデート対象)
    • 64bit Amazon Linux 2015.03 v1.4.1 running Docker 1.6.0
    • 64bit Amazon Linux 2015.03 v1.4.1 running Multi-container Docker 1.6.0 (Generic)
  • ECS-Optimized Amazon Linuxの対応バージョン(2015.03.b以前がアップデート対象)
    • Amazon Linux AMI 2015.03.c x86_64 ECS HVM GP2

まとめ

ちょっと珍しい、Dockerのバグに起因する不具合情報のご紹介でした。意外と原因の切り分けに苦戦しそうな部分だと思うので、何かのトラブルシューティングのお役に立てれば幸いです。