Python 如何在AWS ECS上的Flask/MongoDB上设置环境变量?

Python 如何在AWS ECS上的Flask/MongoDB上设置环境变量?,python,mongodb,docker,flask,amazon-ecs,Python,Mongodb,Docker,Flask,Amazon Ecs,我有一个运行MongoDB的flask应用程序 在本地,当我使用下面的方法构建和运行容器时,应用程序在本地运行得非常好 docker-compose build docker-compose up 以下是创建的容器: /application$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS

我有一个运行MongoDB的flask应用程序

在本地,当我使用下面的方法构建和运行容器时,应用程序在本地运行得非常好

docker-compose build
docker-compose up
以下是创建的容器:

/application$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
9e054b28bb46        application_web     "/bin/sh -c 'python …"   38 seconds ago      Up 37 seconds       0.0.0.0:80->80/tcp, 27017/tcp   application_web_1
2a19a8e9a267        mongo:3.0.2         "/entrypoint.sh mong…"   39 seconds ago      Up 38 seconds       0.0.0.0:27017->27017/tcp        application_db_1
我的app.py中有以下内容:

MONGODB_HOST = os.environ['DB_PORT_27017_TCP_ADDR']
MONGODB_PORT = 27017

app = Flask(__name__)
bootstrap = Bootstrap(app)
client = MongoClient(MONGODB_HOST, MONGODB_PORT)
docker compose.yml

web:
  build: .
  command: python -u app.py
  ports:
    - "80:80"
  volumes:
    - .:/project
  environment:
    MONGODB_HOST: db
  links:
      - db

db:
  image: mongo:3.4
  command: mongod
  ports:
    - "27017:27017"
Dockerfile

FROM python:3.6.1-alpine

MAINTAINER mebarkiakhalil@gmail.com

WORKDIR /project

ADD . /project

RUN pip install -r requirements.txt

EXPOSE 80

EXPOSE 27017

CMD ["mongod"]

ENV NAME Cheppers_DevOps_Challenge

ENTRYPOINT python app.py
我面临的问题是,在将映像推送到AWS ECS之后,我使用给定的容器映像推送存储库创建集群,我总是在任务定义日志中看到此错误:

2019-10-08 14:19:02
MONGODB_HOST = os.environ['DB_PORT_27017_TCP_ADDR']
KeyError: 'DB_PORT_27017_TCP_ADDR'

我建议您更换mongo主机:

MONGODB_HOST = "db"
os.environ['DB\u PORT\u 27017\u TCP\u ADDR']
将使用您不需要的容器的IP地址,因为
compose
将使用服务名称为您处理该地址

我认为
AWS
以不同的方式处理IP地址,不再是
dict
(“keyrerror”)

pymongo.errors.ServerSelectionTimeoutError:db:27017:[Errno-2]名称 不解决——

原因是容器链接不正确,如果您确实有兴趣在ECS中使用链接,您应该在相同的任务定义中定义两个容器表示每个任务定义两个容器,您不能从两个不同的任务定义链接容器

然后您可以通过@linpy提到的容器引用mongo容器

因此,容器的任务定义如下所示

并更新python容器任务定义中的链接部分,或使用注释中提到的JSON


这是否意味着我必须在集群中为其创建另一个容器 MongoDB

如果你创造

  • 新的数据库任务定义
  • 数据库服务

那么在上述情况下链接将不起作用,那么您必须使用或内部LB。

您已经定义了
环境:MONGODB\u主机:db
。在那里添加
DB\u PORT\u 27017\u TCP\u ADDR
。@AlexBlex你的意思是在
docker compose.yml
中添加
DB\u PORT\u 27017\u TCP\u ADDR
?不,请在本地阅读@LinPy它是这样工作的。我不知道是怎么回事,但在AWS上它出了问题。@LinPy但问题是在AWS上它不起作用。我不明白你在这里的意思它起作用了!flask应用程序已部署并正在AWS上运行!但是,没有建立MongoDB连接这是我得到的错误
pymongo.errors.ServerSelectionTimeoutError:db:27017:[Errno-2]名称无法解析
我认为在aws中可以配置链接:
“链接”:[“名称:internalName”,…]
see我想我已经在
docker compose.yml中添加了链接,尝试在AWS中设置它们,这是否意味着我必须在集群中为MongoDB创建另一个容器?谢谢!我有几个问题。创建新任务定义时,应使用Fargate或EC2哪种启动兼容性类型?另外,在为MongoDB创建容器时,必须使用哪个映像?在你的回答中,我似乎给出了同样的印象。端口映射呢?Python容器应该是
80
,而
db
容器应该是
27017
?Fargate不支持链接。在链接过程中,不必为内部通信发布端口,如果要从外部连接,则发布mongo端口,即
27017
。你可以使用官方图像