AWS Elastic Beanstalk 给出"could not translate host name "数据库" to address"错误



我一直在尝试部署由Django,Postgresql和Nginx组成的docker。当我做

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

我所做的是我使用

sudo docker build -t myname/dockername -f Dockerfile
将我的 docker 推送到 docker 集线器。 我只是做
eb 部署

文件结构

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 时,我会运行 3 个不同的容器。但是在EB上,我只看到一个容器正在运行。

我认为这是因为我正在从我用这些文件构建的 docker hub 获取映像,并且以某种方式导致这 3 个容器成为一个容器,并且它搞砸了识别主机名?我仍然不太确定。帮助将不胜感激。谢谢!

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( 手动更新它

可以使用示例,例如:

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

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

你可以试试micahhausler/container-transform:

转换 docker 编写、ECS 和马拉松配置 转换 docker 编写、ECS 和马拉松配置

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

$ 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

根据撰写中的网络 |码头工人文档:

例如,假设您的应用位于名为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. 容器
  3. 是使用web的配置创建的。它以名称加入网络myapp_defaultweb
  4. 容器是使用db的配置创建的。它以名称加入网络myapp_defaultdb

因此,由于所有容器都链接到同一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"
}
]
}

相关内容

最新更新