Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"Invalid configuration for registry" error when executing "eb local run"

I think this is a very easy to fix problem, but I just can't seem to solve it! I've spent a good amount of time looking for any leads on Google/SO but couldn't find a solution.

When executing eb local run, I'm getting this error:

Invalid configuration for registry

$ eb local run                        
ERROR: InvalidConfigFile :: Invalid configuration for registry 12345678.dkr.ecr.eu-west-1.amazonaws.com

The image lines in my Dockerrun.aws.json are as follows:

{
  "AWSEBDockerrunVersion": 2,
  "volumes": [
      {
          "name": "frontend",
          "host": {
              "sourcePath": "/var/app/current/frontend"
          }
      },
      {
          "name": "backend",
          "host": {
              "sourcePath": "/var/app/current/backend"
          }
      },
      {
        "name": "nginx-proxy-conf",
        "host": {
          "sourcePath": "/var/app/current/config/nginx"
        }
      },
      {
        "name": "nginx-proxy-content",
        "host": {
          "sourcePath": "/var/app/current/content/"
        }
      },
      {
        "name": "nginx-proxy-ssl",
        "host": {
          "sourcePath": "/var/app/current/config/ssl"
        }
      }

  ],
    "containerDefinitions": [
        {
            "name": "backend",
            "image": "123456.dkr.ecr.eu-west-1.amazonaws.com/backend:latest",
            "Update": "true",
            "essential": true,
            "memory": 512,
            "mountPoints": [
                {
                    "containerPath": "/app/backend",
                    "sourceVolume": "backend"
                }
            ],
            "portMappings": [
                {
                    "containerPort": 4000,
                    "hostPort": 4000
                }
            ],
            "environment": [
                {
                    "name": "PORT",
                    "value": "4000"
                },
                {
                    "name": "MIX_ENV",
                    "value": "dev"
                },
                {
                    "name": "PG_PASSWORD",
                    "value": "xxsaxaax"
                },
                {
                    "name": "PG_USERNAME",
                    "value": "
                },
                {
                    "name": "PG_HOST",
                    "value": "123456.dsadsau89das.eu-west-1.rds.amazonaws.com"
                },
                {
                    "name": "FE_URL",
                    "value": "http://develop1.com"
                }


            ]
        },
        {
            "name": "frontend",
            "image": "123456.dkr.ecr.eu-west-1.amazonaws.com/frontend:latest",
            "Update": "true",
            "essential": true,
            "memory": 512,
            "links": [
                "backend"
            ],
            "command": [
                "npm",
                "run",
                "production"
            ],
            "mountPoints": [
                {
                    "containerPath": "/app/frontend",
                    "sourceVolume": "frontend"
                }
            ],
            "portMappings": [
                {
                    "containerPort": 3000,
                    "hostPort": 3000
                }
            ],
            "environment": [
                {
                    "name": "REDIS_HOST",
                    "value": "www.eample.com"
                }
            ]
        },
        {
          "name": "nginx-proxy",
          "image": "nginx",
          "essential": true,
          "memory": 128,
          "portMappings": [
            {
              "hostPort": 80,
              "containerPort": 3000
            }
          ],
          "links": [
              "backend",
              "frontend"
          ],
          "mountPoints": [
            {
              "sourceVolume": "nginx-proxy-content",
              "containerPath": "/var/www/html"
            },
            {
              "sourceVolume": "awseb-logs-nginx-proxy",
              "containerPath": "/var/log/nginx"
            },
            {
              "sourceVolume": "nginx-proxy-conf",
              "containerPath": "/etc/nginx/conf.d",
              "readOnly": true
            },
            {
              "sourceVolume": "nginx-proxy-ssl",
              "containerPath": "/etc/nginx/ssl",
              "readOnly": true
            }
          ]
        }
    ],
    "family": ""
}
like image 759
Chris Avatar asked May 17 '17 14:05

Chris


3 Answers

It seems that you have a broken docker-registry auth config file. In your home, this file ~/.docker/config.json, should look something like:

{
    "auths": {
        "https://1234567890.dkr.ecr.us-east-1.amazonaws.com": {
            "auth": "xxxxxx"
        }
    }
}

That is generated with the command docker login (related to aws ecr get-login)

Check that. I say this because you are entering in an exception here:

for registry, entry in six.iteritems(entries):
    if not isinstance(entry, dict):
        # (...)
        if raise_on_error:
            raise errors.InvalidConfigFile(
                'Invalid configuration for registry {0}'.format(registry)
            )
        return {}
like image 60
Robert Avatar answered Oct 22 '22 14:10

Robert


This is due to outdated dependencies in the current version of the awsebcli tool. They pinned version "docker-py (>=1.1.0,<=1.7.2)" which does not support the newer credential helper formats. The latest version of docker-py is the first one to properly support the latest credential helper format and until the AWS EB CLI developers update docker-py to use 2.4.0 (https://github.com/docker/docker-py/releases/tag/2.4.0) this will remain broken.

like image 24
Techdragon Avatar answered Oct 22 '22 14:10

Techdragon


First is that it's not valid json, The PG_USERNAME field does not have the enclosing quote.

{
    "name": "PG_USERNAME",
    "value": "
},

Should be

{
    "name": "PG_USERNAME",
    "value": ""
},

Next thing to check is to see if your Beanstalk instance profile has access to the ecr registry.

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/iam-instanceprofile.html

Specifies the Docker base image on an existing Docker repository from which you're building a Docker container. Specify the value of the Name key in the format / for images on Docker Hub, or // for other sites.

When you specify an image in the Dockerrun.aws.json file, each instance in your Elastic Beanstalk environment will run docker pull on that image and run it. Optionally include the Update key. The default value is "true" and instructs Elastic Beanstalk to check the repository, pull any updates to the image, and overwrite any cached images.

Do not specify the Image key in the Dockerrun.aws.json file when using a Dockerfile. .Elastic Beanstalk will always build and use the image described in the Dockerfile when one is present.

http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker_image.html

Test to make sure you can access your ecr outside of Elasticbeanstalk as well.

$ docker pull aws_account_id.dkr.ecr.us-west-2.amazonaws.com/amazonlinux:latest
latest: Pulling from amazonlinux
8e3fa21c4cc4: Pull complete
Digest: sha256:59895a93ba4345e238926c0f4f4a3969b1ec5aa0a291a182816a4630c62df769
Status: Downloaded newer image for aws_account_id.dkr.ecr.us-west-2.amazonaws.com/amazonlinux:latest

http://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-pull-ecr-image.html

like image 45
strongjz Avatar answered Oct 22 '22 13:10

strongjz