8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Dockerコマンドのエラー: docker-compose up ができない(またはAWSのAmazon ECRからイメージをプルできない)

Last updated at Posted at 2021-02-12

Dockerが起動できない

こんな感じのエラーが出て、Dockerを起動できなくなりました。

work_space $ docker-compose up -d

Traceback (most recent call last):
  File "site-packages/urllib3/connectionpool.py", line 677, in urlopen
  File "http/client.py", line 1252, in request
  File "http/client.py", line 966, in send
  File "site-packages/docker/transport/unixconn.py", line 43, in connect
ConnectionRefusedError: [Errno 61] Connection refused

During handling of the above exception, another exception occurred:

(〜中略〜)

docker.errors.DockerException: Error while fetching server API version: ('Connection aborted.', ConnectionRefusedError(61, 'Connection refused'))
[18539] Failed to execute script docker-compose

余談ですが"Dockerの起動"って曖昧な表現ですね。
Docker Desktopの起動のことかもしれないし、イメージの作成のことかもしれないし、コンテナの作成・起動のことかもしれないし、etc。

docker-compose up は、イメージ未作成ならイメージを作成してコンテナを作成・起動。コンテナが既に存在すれば、そのコンテナを起動する。みたいな感じで、今回自分がやろうとしたのは「イメージを作成してコンテナを作成・起動する」の部分。

いくつか心当たりがあるので、順に試した結果を書いてみることにします。

他のDockerを終了させる

そういえば、他の場所で立ち上がっているコンテナがあったような気がしたので、いったんその場所に移動してDockerを完全に終了させてみます。

work_space $ cd ../another_work_space
another_work_space $ docker-compose down
Removing nginx ... done
Removing php   ... done
Removing redis ... done
Removing network sampledocker-compose_default

終了できました。
次に、さっきDockerを起動しようとした場所に移動して、再度起動を試みます。


another_work_space $ cd ../work_space 
work_space $ docker-compose up -d
Creating network "sampledocker-compose_default" with the default driver
Pulling php (aws_account_id.dkr.ecr.region.amazonaws.com/sample.com:php)...
ERROR: The image for the service you're trying to recreate has been removed. If you continue, volume data could be lost. Consider backing up your data before continuing.

Continue with the new image? [yN]
The image for the service you're trying to recreate has been removed. If you continue, volume data could be lost. Consider backing up your data before continuing.
``` ということで、エラーが変わりました。「イメージを新規作成して続けますか?」とのことなので、いったん "yes" で進めてみます。

```bash
Continue with the new image? [yN]y
Pulling php (aws_account_id.dkr.ecr.region.amazonaws.com/sample.com:php)...
ERROR: pull access denied for aws_account_id.dkr.ecr.region.amazonaws.com/sample.com, repository does not exist or may require 'docker login': denied: Your authorization token has expired. Reauthenticate and try again.

エラー内容で大体察しはつきましたが、もう一度 docker-compose up をしてから、念のため次は "NO" で進めてみることにします。

work_space $ docker-compose up -d
Pulling php (aws_account_id.dkr.ecr.region.amazonaws.com/sample.com:php)...
ERROR: The image for the service you're trying to recreate has been removed. If you continue, volume data could be lost. Consider backing up your data before continuing.

Continue with the new image? [yN]N
ERROR: pull access denied for aws_account_id.dkr.ecr.region.amazonaws.com/sample.com, repository does not exist or may require 'docker login': denied: Your authorization token has expired. Reauthenticate and try again.

やっぱりダメですね。きちんとエラーの内容を読んで対処してみます。

AWSのAmazon ECRからイメージをプルする方法

そもそもの前提として、Dockerイメージはチーム開発用に共通のものを使用しており、AWSのAmazon ECR プライベートレジストリにホストされています。
最後のエラー内容では ```ERROR: pull access denied for aws_account_id.dkr.ecr.region.amazonaws.com/sample.com, repository does not exist or may require 'docker login': denied: Your authorization token has expired. Reauthenticate and try again.




なおECRへのログインには、自分の ```aws_account_id``` と ```region``` を知る必要があります。
実は今まで出たエラー内容の中に aws_account_id と region の記載はあるのですが、別な経路での確認方法も記載します。

例えば自分の場合、region はインフラチームから事前に教えてもらっていましたが、aws_account_id はある時点で不明でした。
aws_account_id も聞けば教えてもらえたかもしれませんが、自分で調べることもできます。
(他にも、事前にAWSのアカウントが発行されている、権限が付与されている、aws configure などでAWSの個人設定を済ませていることが前提となります。)

## 自分のAWSアカウントID確認する

aws_account_idの確認方法は、AWSのユーザーガイドを参考にしました。

[AWS アカウント ID とそのエイリアス](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/console_account-alias.html)

次のコマンドで自分のaws_account_idを調べてみます。

```bash
work_space $ aws sts get-caller-identity
{
    "UserId": "xxxxx",
    "Account": "00000",
    "Arn": "00000:user/name@sample.com"
}

account_idは 00000 ということが分かりました。
このidを使って、ECRにログインしてみます。

AWSのAmazon ECRへログインする

ECRへのログイン方法は、以下の記事を参考にしています。

AWS CLIでECRにログインする時はget-loginではなくget-login-passwordを使おう

<aws_account_id><region> の部分は、それぞれ自分のものに読み替えて入力します。

work_space $ aws ecr get-login-password | docker login --username AWS --password-stdin https://<aws_account_id>.dkr.ecr.<region>.amazonaws.com
Login Succeeded

AWS側でログインできました!
これでようやく、 docker-compose up ができそうです。

work_space $ docker-compose up -d
Pulling php (aws_account_id.dkr.ecr.region.amazonaws.com/sample.com:php)...
php: Pulling from sample.com
f2e3d4a1dba1: Already exists
98f4121a92aa: Already exists
87df5a4e1443: Already exists
2e5badece1a3: Pull complete
ef315f325e31: Pull complete

(〜中略〜)

Creating sample_redis ... done
Creating sample_php   ... done
Creating sample_nginx ... done

無事にDockerを起動することができました!

【参考URL】

docker-compose up って何?
AWS CLIでECRにログインする時はget-loginではなくget-login-passwordを使おう
AWS アカウント ID とそのエイリアス
Docs » Docker Compose » コマンドライン・リファレンス » up

8
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?