localstack/docs

Elastic Container Registry (ECR)

snyderpa-owl opened this issue · 1 comments

With reference to the doc at https://docs.localstack.cloud/user-guide/aws/ecr/ -- it doesn't work -- see error at bottom of this block:

root@localstack:/src/github.com/carp/carp# docker build -t localstack-ecr-image .
[+] Building 196.7s (8/8) FINISHED                                                                                                                  docker:default
 => [internal] load .dockerignore                                                                                                                             0.0s
 => => transferring context: 2B                                                                                                                               0.0s
 => [internal] load build definition from Dockerfile                                                                                                          0.0s
 => => transferring dockerfile: 618B                                                                                                                          0.0s
 => [internal] load metadata for public.ecr.aws/docker/library/ubuntu:18.04                                                                                   2.2s
 => [1/4] FROM public.ecr.aws/docker/library/ubuntu:18.04@sha256:152dc042452c496007f07ca9127571cb9c29697f42acbfad72324b2bb2e43c98                             4.0s
 => => resolve public.ecr.aws/docker/library/ubuntu:18.04@sha256:152dc042452c496007f07ca9127571cb9c29697f42acbfad72324b2bb2e43c98                             0.0s
 => => sha256:f97a5103cca28097326814718e711c9c41b54853c26959d73495e40b1dd608f2 424B / 424B                                                                    0.0s
 => => sha256:d1a528908992e9b5bcff8329a22de1749007d0eeeccb93ab85dd5a822b8d46a0 2.31kB / 2.31kB                                                                0.0s
 => => sha256:064a9bb4736de1b2446f528e4eb37335378392cf9b95043d3e9970e253861702 22.71MB / 22.71MB                                                              3.3s
 => => sha256:152dc042452c496007f07ca9127571cb9c29697f42acbfad72324b2bb2e43c98 1.33kB / 1.33kB                                                                0.0s
 => => extracting sha256:064a9bb4736de1b2446f528e4eb37335378392cf9b95043d3e9970e253861702                                                                     0.6s
 => [2/4] RUN apt-get update &&     apt-get -y install apache2                                                                                              189.5s
 => [3/4] RUN echo 'Hello World!' > /var/www/html/index.html                                                                                                  0.3s 
 => [4/4] RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh &&     echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh &&     echo 'mkdir -p /var/  0.2s 
 => exporting to image                                                                                                                                        0.4s 
 => => exporting layers                                                                                                                                       0.4s 
 => => writing image sha256:825665cb526e47f67383c78d0c6760a47cce8f3e409007fc6743e67bb3dde59a                                                                  0.0s 
 => => naming to docker.io/library/localstack-ecr-image                                                                                                       0.0s 
root@localstack:/src/github.com/carp/carp# docker images | grep localstack-ecr-image
localstack-ecr-image                                                                                           latest             825665cb526e   56 seconds ago   185MB
root@localstack:/src/github.com/carp/carp# awslocal ecr create-repository --repository-name localstack-ecr-repository --image-scanning-configuration scanOnPush=true
{
    "repository": {
        "repositoryArn": "arn:aws:ecr:us-east-1:000000000000:repository/localstack-ecr-repository",
        "registryId": "000000000000",
        "repositoryName": "localstack-ecr-repository",
        "repositoryUri": "000000000000.dkr.ecr.us-east-1.localstack:4566/localstack-ecr-repository",
        "createdAt": 1721014341.0,
        "imageTagMutability": "MUTABLE",
        "imageScanningConfiguration": {
            "scanOnPush": true
        },
        "encryptionConfiguration": {
            "encryptionType": "AES256"
        }
    }
}
root@localstack:/src/github.com/carp/carp# docker tag localstack-ecr-image 000000000000.dkr.ecr.us-east-1.localstack:4566/localstack-ecr-repository
root@localstack:/src/github.com/carp/carp# docker push 000000000000.dkr.ecr.us-east-1.localstack:4566/localstack-ecr-repository
Using default tag: latest
The push refers to repository [000000000000.dkr.ecr.us-east-1.localstack:4566/localstack-ecr-repository]
Get "https://000000000000.dkr.ecr.us-east-1.localstack:4566/v2/": dialing 000000000000.dkr.ecr.us-east-1.localstack:4566 with direct connection: resolving host 000000000000.dkr.ecr.us-east-1.localstack: lookup 000000000000.dkr.ecr.us-east-1.localstack: no such host
root@localstack:/src/github.com/carp/carp# awslocal ecr list-images --repository-name localstack-ecr-repository
{
    "imageIds": []
}

docker-compose service declaration:

  localstack:
    container_name: "localstack"
    hostname: localstack
    image: web_api/localstack-pro
    build:
      context: ./
      dockerfile: localstack.dockerfile
    ports:
      - "127.0.0.1:4566:4566" # LocalStack Gateway
      - "127.0.0.1:4510-4559:4510-4559" # external services port range
      - "127.0.0.1:443:443"              # LocalStack HTTPS Gateway (Pro)
    environment:
      - DOCKER_HOST=unix:///var/run/docker.sock
      - LOCALSTACK_HOST=localstack
      - GATEWAY_LISTEN=0.0.0.0
      - SQS_ENDPOINT_STRATEGY=standard
      - LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN:-}
      - ACTIVATE_PRO=${LOCALSTACK_AUTH_TOKEN:-0}
      - DEBUG=${LOCALSTACK_DEBUG:-0}
      - PERSISTENCE=${LOCALSTACK_PERSISTENCE:-1}
      - SNAPSHOT_SAVE_STRATEGY=${LOCALSTACK_SNAPSHOT_SAVE_STRATEGY:-SCHEDULED}
      - SNAPSHOT_FLUSH_INTERVAL=${LOCALSTACK_SNAPSHOT_FLUSH_INTERVAL:-15}
      - STAGE=default
    volumes:
      # required by localstack
      - "/var/run/docker.sock:/var/run/docker.sock"
      # initialization script -- use to set up filesystem objects
      - "./dev_config/-localstack/init.sh:/init.sh"
      # scripts to run automatically when localstack is ready -- use for setting up things used in all dev situations
      - "./dev_config/localstack/etc/localstack/init/ready.d:/etc/localstack/init/ready.d"
      # shared data volumes
      - "./dev_config/storage:/storage"
      - "./dev_config/storage/localstack:/var/lib/localstack"
      # script to proxy commands to terraform via `kubectl exec`
      - "./dev_config/localstack/proxy_terraform.sh:/proxy_terraform.sh"
      # map parent folder to a shared source file location in the container
      - "..:/src/github.com/carp"
      # aws credentials
      - ./dev_config/localstack/root/.aws:/root/.aws
      # terraform override
      # - ./dev_config/localstack/src/github.com/carp/queuePreparationService/terraform/override.tf:/src/github.com/carp/queuePreparationService/terraform/override.tf
    entrypoint: [ '/bin/bash', '-c', '/init.sh && docker-entrypoint.sh' ]

Dockerfile

FROM public.ecr.aws/docker/library/ubuntu:18.04

# Install dependencies
RUN apt-get update && \
    apt-get -y install apache2

# Install apache and write hello world message
RUN echo 'Hello World!' > /var/www/html/index.html

# Configure apache
RUN echo '. /etc/apache2/envvars' > /root/run_apache.sh && \
    echo 'mkdir -p /var/run/apache2' >> /root/run_apache.sh && \
    echo 'mkdir -p /var/lock/apache2' >> /root/run_apache.sh && \
    echo '/usr/sbin/apache2 -D FOREGROUND' >> /root/run_apache.sh && \
    chmod 755 /root/run_apache.sh

EXPOSE 80

CMD /root/run_apache.sh

localstack.dockerfile

FROM localstack/localstack-pro:3.5

RUN apt-get clean && apt-get update && apt-get upgrade -y && apt-get install -y gpg wget lsb-release ca-certificates
RUN install -m 0755 -d /etc/apt/keyrings
RUN wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" \
    | tee /etc/apt/sources.list.d/hashicorp.list
RUN curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
RUN chmod a+r /etc/apt/keyrings/docker.asc
RUN echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
    $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
    | tee /etc/apt/sources.list.d/docker.list
RUN apt-get update
RUN apt-get install -y terraform docker-ce less nano jq vim

RUN apt-get remove -y gpg apt-transport-https
RUN pip install terraform-local awscli-local

aws config

[default]
region=us-east-1
output=json
endpoint_url=http://localhost:4566

aws credentials

[default]
aws_access_key_id=test
aws_secret_access_key=test

Thanks to LocalStack support for this solution: the issue arises from defining LOCALSTACK_HOST=localstack and GATEWAY_LISTEN=0.0.0.0 in the docker-compose service configuration. Using this configuration the documented steps succeed:

  localstack:
    container_name: "${LOCALSTACK_DOCKER_NAME:-localstack-main}"
    image: web_api/localstack-pro
    build:
      context: ./
      dockerfile: localstack.dockerfile
    ports:
      - "127.0.0.1:4566:4566"            # LocalStack Gateway
      - "127.0.0.1:4510-4559:4510-4559"  # external services port range
      - "127.0.0.1:443:443"              # LocalStack HTTPS Gateway (Pro)
    environment:
      # LocalStack configuration: https://docs.localstack.cloud/references/configuration/
      - DEBUG=${LOCALSTACK_DEBUG:-0}
      - LOCALSTACK_AUTH_TOKEN=${LOCALSTACK_AUTH_TOKEN:-}
      - ACTIVATE_PRO=${LOCALSTACK_AUTH_TOKEN:-0}
    volumes:
      - "${LOCALSTACK_VOLUME_DIR:-./volume}:/var/lib/localstack"
      - "/var/run/docker.sock:/var/run/docker.sock"
      # map parent folder to a shared source file location in the container
      - "..:/src/github.com/carp"
      - ```