【问题标题】:How to set Environment Variables on Flask/MongoDB on AWS ECS?如何在 AWS ECS 上的 Flask/MongoDB 中设置环境变量?
【发布时间】:2020-02-05 17:44:51
【问题描述】:

我有一个使用 MongoDB 运行的烧瓶应用程序。

在本地,当我使用以下内容构建和运行容器时,应用程序在本地运行得非常好。

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'

【问题讨论】:

  • 您已经定义了environment: MONGODB_HOST: db。在此处添加DB_PORT_27017_TCP_ADDR
  • @AlexBlex 你的意思是docker-compose.yml 中的db 我放了DB_PORT_27017_TCP_ADDR ?
  • @LinPy 在本地是这样工作的。我不知道怎么做,但在 AWS 上出错了。
  • @LinPy 但问题出在 AWS 上它不起作用。我不明白你的意思

标签: python mongodb docker flask amazon-ecs


【解决方案1】:

我建议你更换 mongo 主机:

MONGODB_HOST = "db"

os.environ['DB_PORT_27017_TCP_ADDR'] 将使用您不需要的容器的 IP 地址,因为compose 将使用服务名称为您处理。

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

【讨论】:

  • 成功了!烧瓶应用程序已部署并在 AWS 上运行!但是,没有建立 MongoDB 连接这是我得到的错误pymongo.errors.ServerSelectionTimeoutError: db:27017: [Errno -2] Name does not resolve
  • 我认为您可以在 aws 中配置链接:"links": ["name:internalName", ...] 参见 docs.aws.amazon.com/AmazonECS/latest/developerguide/…
  • 我想我在docker-compose.yml中添加了链接东西
  • 尝试在 aws 中设置它们
  • 这是否意味着我必须在集群中为 MongoDB 创建另一个容器? (node.university/blog/10067/aws-ecs-containers)
【解决方案2】:

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

原因是容器没有正确链接,如果你真的有兴趣在ECS中使用链接,你应该在相同的任务定义中定义两个容器,即每个任务定义两个容器,你无法从两个不同的任务定义中链接容器。

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

所以容器的任务定义如下所示

并更新 python 容器的任务定义中的链接部分或使用评论中提到的 JSON。

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

如果你创建

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

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

【讨论】:

  • 谢谢!我有几个问题。在创建新任务定义时,应该使用 Fargate 还是 EC2 的启动兼容性类型?另外,在为 MongoDB 创建容器时,必须使用哪个镜像?在您的回答中,似乎我给出了相同的图像。端口映射呢?对于 Python 容器应该是 80,对于 db 容器应该是 27017
  • Fargate 不支持链接。在链接时,您不一定需要发布用于内部通信的端口,如果您想从外部连接,则发布 27017 的 mongo 端口。你可以使用官方图片
猜你喜欢
  • 2019-08-17
  • 2020-09-20
  • 2014-12-17
  • 1970-01-01
  • 2020-12-13
  • 1970-01-01
  • 2016-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多