AWS Elastic Beanstalk gives “could not translate host name ”db“ to address” error

☆樱花仙子☆ 提交于 2021-02-16 18:57:12

问题


I've been trying to deploy my docker consisted of Django, Postgresql and Nginx. It works fine when I do

sudo docker-compose up
However when deploy it on AWS EB, it gives me
could not translate host name "db" to address: Name or service not known

What I've done is I pushed my docker to docker hub using

sudo docker build -t myname/dockername -f Dockerfile .
and I simply do
eb deploy

File Structure

myproject
    myproject
        settings.py
        urls.py
        ...
    Dockerfile
    Dockerrun.aws.json
    manage.py
    requirements.txt
    ...

Dockerfile

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/
EXPOSE 8000
CMD ["sh", "on-container-start.sh"]

Dockerrun.aws.json

{
 "AWSEBDockerrunVersion": "1",
 "Image": {
   "Name": "myname/dockername:latest",
   "Update": "true"
 },
 "Ports": [
   {
     "ContainerPort": "8000"
   }
 ]
}

docker-compose.yml

version: '3'

services:
  db:
    image: postgres
    hostname: db
    networks:
     - some_network
  web:
    restart: always
    build: .
    volumes:
      - .:/code
    hostname: web
    expose:
      - "8000"
    depends_on:
      - db
    links:
      - db:db
    networks:
      - some_network
  nginx:
    image: nginx
    hostname: nginx
    ports:
      - "8000:8000"
    volumes:
      - ./config/nginx:/etc/nginx/conf.d
    depends_on:
      - web
    networks:
      - some_network
networks:
  some_network:

One thing I realize is that when I use docker-compose up on my machine, I get 3 different containers running. However on EB, I see only one container running.

I think it's because I'm fetching the image from docker hub that I built with those files and that somehow caused these 3 containers to be one and it's messing up with recognizing host names? I am quite not sure still. Help will be greatly appreciated. Thanks!


回答1:


Dockerrun.aws.json should correlate with docker-compose.yml

The reason of issue that host name ”db“ could not be translated to address is that the docker-compose.yml and Dockerrun.aws.json files describe a different architecture:

  • There are 3 containers in docker-compose.yml
  • There is only 1 container in Dockerrun.aws.json

Therefore, the application tries to resolve the db hostname and cannot find it, because db not declared in Dockerrun.aws.json

Fix Dockerrun.aws.json

So, update your Dockerrun.aws.json. You can do it either manually or using convenient tool micahhausler/container-transform:

a) update it manually

You can use samples, such as:

  • k2works/aws-eb-docker-multi-container-sample**

b) update it using micahhausler/container-transform

You can try micahhausler/container-transform:

Transforms docker-compose, ECS, and Marathon configurations Transforms docker-compose, ECS, and Marathon configurations

Here is what it outputs for your case:

$ container-transform docker-compose.yml > Dockerrun.aws.json

Dockerrun.aws.json

{
    "containerDefinitions": [
        {
            "essential": true,
            "image": "postgres",
            "name": "db"
        },
        {
            "essential": true,
            "image": "nginx",
            "mountPoints": [
                {
                    "containerPath": "/etc/nginx/conf.d",
                    "sourceVolume": "_ConfigNginx"
                }
            ],
            "name": "nginx",
            "portMappings": [
                {
                    "containerPort": 8000,
                    "hostPort": 8000
                }
            ]
        },
        {
            "essential": true,
            "links": [
                "db:db"
            ],
            "mountPoints": [
                {
                    "containerPath": "/code",
                    "sourceVolume": "_"
                }
            ],
            "name": "web"
        }
    ],
    "family": "",
    "volumes": [
        {
            "host": {
                "sourcePath": "."
            },
            "name": "_"
        },
        {
            "host": {
                "sourcePath": "./config/nginx"
            },
            "name": "_ConfigNginx"
        }
    ]
}

Note:: Of course, you should fix missing settings such as memory for db and nginx containers.

You can omit networks at all

According to Networking in Compose | Docker Documentation:

For example, suppose your app is in a directory called myapp, and your docker-compose.yml looks like this:

docker-compose.yml

version: "3"
services:
  web:
    build: .
    ports:
      - "8000:8000"
  db:
    image: postgres
    ports:
      - "8001:5432"

When you run docker-compose up, the following happens:

  1. A network called myapp_default is created.
  2. A container is created using web’s configuration. It joins the network myapp_default under the name web.
  3. A container is created using db’s configuration. It joins the network myapp_default under the name db.

So, since all your containers linked to the same some_network, you can omit it.

docker-compose.yml

version: '3'

services:
  db:
    image: postgres
    hostname: db
  web:
    restart: always
    build: .
    volumes:
      - .:/code
    hostname: web
    expose:
      - "8000"
    depends_on:
      - db
    links:
      - db:db
  nginx:
    image: nginx
    hostname: nginx
    ports:
      - "8000:8000"
    volumes:
      - ./config/nginx:/etc/nginx/conf.d
    depends_on:
      - web

And $ container-transform docker-compose.yml > Dockerrun.aws.json will produce:

Dockerrun.aws.json

{
    "containerDefinitions": [
        {
            "essential": true,
            "image": "postgres",
            "name": "db"
        },
        {
            "essential": true,
            "image": "nginx",
            "mountPoints": [
                {
                    "containerPath": "/etc/nginx/conf.d",
                    "sourceVolume": "_ConfigNginx"
                }
            ],
            "name": "nginx",
            "portMappings": [
                {
                    "containerPort": 8000,
                    "hostPort": 8000
                }
            ]
        },
        {
            "essential": true,
            "links": [
                "db:db"
            ],
            "mountPoints": [
                {
                    "containerPath": "/code",
                    "sourceVolume": "_"
                }
            ],
            "name": "web"
        }
    ],
    "family": "",
    "volumes": [
        {
            "host": {
                "sourcePath": "."
            },
            "name": "_"
        },
        {
            "host": {
                "sourcePath": "./config/nginx"
            },
            "name": "_ConfigNginx"
        }
    ]
}


来源:https://stackoverflow.com/questions/57684920/aws-elastic-beanstalk-gives-could-not-translate-host-name-db-to-address-erro

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!