【问题标题】:AWS Elastic Beanstalk gives "could not translate host name "db" to address" errorAWS Elastic Beanstalk 给出“无法将主机名“db”转换为地址”错误
【发布时间】:2020-01-01 05:45:00
【问题描述】:

我一直在尝试部署由 Django、Postgresql 和 Nginx 组成的 docker。当我这样做时它工作正常

sudo docker-compose up
但是在 AWS EB 上部署它时,它给了我
无法将主机名“db”转换为地址:名称或服务未知

我所做的是使用

将我的 docker 推送到 docker hub
sudo docker build -t myname/dockername -f Dockerfile .
我只是做
eb deploy

文件结构

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:

我意识到,当我在我的机器上使用 docker-compose up 时,我运行了 3 个不同的容器。但是在 EB 上,我只看到一个容器在运行。

我认为这是因为我正在从使用这些文件构建的 docker hub 获取图像,并且不知何故导致这 3 个容器合二为一,并且它在识别主机名时搞砸了?我还不确定。帮助将不胜感激。谢谢!

【问题讨论】:

  • 你在这两种情况下都使用相同的 docker-compose 文件吗?

标签: django amazon-web-services docker docker-compose amazon-elastic-beanstalk


【解决方案1】:

Dockerrun.aws.json 应该与 docker-compose.yml 相关联

无法将主机名“db”转换为地址的原因是docker-compose.ymlDockerrun.aws.json 文件描述了不同的架构:

  • docker-compose.yml 中有 3 个容器
  • Dockerrun.aws.json 中只有 1 个容器

因此,应用程序尝试解析db 主机名但找不到它,因为db 未在Dockerrun.aws.json 中声明

修复Dockerrun.aws.json

所以,更新您的Dockerrun.aws.json。您可以手动完成,也可以使用方便的工具micahhausler/container-transform

a) 手动更新

可以使用示例,如:

b) 使用micahhausler/container-transform 更新它

你可以试试micahhausler/container-transform:

转换 docker-compose、ECS 和 Marathon 配置 转换 docker-compose、ECS 和 Marathon 配置

这是它为您的案例输出的内容:

$ 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"
        }
    ]
}

注意::当然,您应该修复缺少的设置,例如 dbnginx 容器的 memory

你完全可以省略networks

根据Networking in Compose | Docker Documentation

例如,假设您的应用位于名为 myapp 的目录中,而您的 docker-compose.yml 如下所示:

docker-compose.yml

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

当您运行docker-compose up 时,会发生以下情况:

  1. 创建了一个名为myapp_default 的网络。
  2. 使用web 的配置创建一个容器。它以web 的名义加入网络myapp_default
  3. 使用db 的配置创建一个容器。它以db 的名义加入网络myapp_default

因此,由于您的所有容器都链接到同一个 some_network,因此您可以省略它。

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

$ 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"
        }
    ]
}

【讨论】:

  • 非常感谢您帮助我!但是现在我从 aws 方面面对ERROR ECS task stopped due to: Task failed to start. (nginx: CannotCreateContainerError: Error response from daemon: create ./config/nginx: "./config/nginx" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path db: web: ) 。这是 nginx.conf 问题吗?再次,非常感谢!
  • @Jason,像往常一样,nginx 配置存储在 /etc/nginx/conf 之类的地方。对于您的情况,请尝试使用绝对路径而不是 ./config/nginx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
  • 2021-03-27
  • 1970-01-01
  • 2019-01-15
  • 1970-01-01
  • 2020-10-03
  • 2021-02-21
相关资源
最近更新 更多