AWS Elastic Beanstalk 给出“无法将主机名“db”翻译为地址”错误

Jas*_*son 4 django amazon-web-services docker amazon-elastic-beanstalk docker-compose

我一直在尝试部署由 Django、Postgresql 和 Nginx 组成的 docker。当我这样做时效果很好

sudo docker-compose up
但是,当将其部署在 AWS EB 上时,它给了我

无法将主机名“db”转换为地址:名称或服务未知

我所做的是将我的 docker 推送到 docker hub 使用

sudo docker build -t myname/dockername -f Dockerfile 。
我只是这样做
电子部署

文件结构

myproject
    myproject
        settings.py
        urls.py
        ...
    Dockerfile
    Dockerrun.aws.json
    manage.py
    requirements.txt
    ...
Run Code Online (Sandbox Code Playgroud)

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"]
Run Code Online (Sandbox Code Playgroud)

Dockerrun.aws.json

{
 "AWSEBDockerrunVersion": "1",
 "Image": {
   "Name": "myname/dockername:latest",
   "Update": "true"
 },
 "Ports": [
   {
     "ContainerPort": "8000"
   }
 ]
}
Run Code Online (Sandbox Code Playgroud)

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:

Run Code Online (Sandbox Code Playgroud)

我意识到的一件事是,当我在我的机器上使用 docker-compose up 时,我会运行 3 个不同的容器。然而在 EB 上,我看到只有一个容器在运行。

我认为这是因为我从 docker hub 获取了我用这些文件构建的图像,并且以某种方式导致这 3 个容器成为一个容器,并且它在识别主机名方面造成了混乱?我还是不太确定。非常感谢您的帮助。谢谢!

Yas*_*sen 5

Dockerrun.aws.json应该与docker-compose.yml

\n

主机名 \xe2\x80\x9ddb\xe2\x80\x9c 无法转换为地址的问题原因docker-compose.ymlDockerrun.aws.json了不同的体系结构:

\n
    \n
  • 里面有3个集装箱docker-compose.yml
  • \n
  • 里面只有1个集装箱Dockerrun.aws.json
  • \n
\n

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

\n

使固定Dockerrun.aws.json

\n

所以,更新你的Dockerrun.aws.json. 您可以手动或使用方便的工具micahhausler/container-transform来完成来完成此操作:

\n

a) 手动更新

\n

您可以使用示例,例如:

\n\n

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

\n

你可以尝试micahhausler/container-transform

\n
\n

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

\n
\n

以下是它针对您的情况输出的内容:

\n
$ container-transform docker-compose.yml > Dockerrun.aws.json\n
Run Code Online (Sandbox Code Playgroud)\n

Dockerrun.aws.json

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

注意::当然,您应该修复丢失的设置,例如memoryfordbnginxContainers。

\n

你可以省略networks完全可以省略

\n

根据Compose | 中的网络 Docker 文档

\n
\n

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

\n
\n

docker-compose.yml

\n
version: "3"\nservices:\n  web:\n    build: .\n    ports:\n      - "8000:8000"\n  db:\n    image: postgres\n    ports:\n      - "8001:5432"\n\n
Run Code Online (Sandbox Code Playgroud)\n
\n

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

\n
    \n
  1. myapp_default创建了一个名为的网络。
  2. \n
  3. 使用 \xe2\x80\x99s 配置创建容器webmyapp_default它以 的名义加入网络web
  4. \n
  5. 使用 \xe2\x80\x99s 配置创建容器dbmyapp_default它以 的名义加入网络db
  6. \n
\n
\n

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

\n

docker-compose.yml

\n
version: \'3\'\n\nservices:\n  db:\n    image: postgres\n    hostname: db\n  web:\n    restart: always\n    build: .\n    volumes:\n      - .:/code\n    hostname: web\n    expose:\n      - "8000"\n    depends_on:\n      - db\n    links:\n      - db:db\n  nginx:\n    image: nginx\n    hostname: nginx\n    ports:\n      - "8000:8000"\n    volumes:\n      - ./config/nginx:/etc/nginx/conf.d\n    depends_on:\n      - web\n
Run Code Online (Sandbox Code Playgroud)\n

并将$ container-transform docker-compose.yml > Dockerrun.aws.json产生:

\n

Dockerrun.aws.json

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