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

时间:2019-10-08 12:25:10

标签: 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                           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'

2 个答案:

答案 0 :(得分:2)

我建议您更改mongo主机:

MONGODB_HOST = "db"

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

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

答案 1 :(得分:1)

  

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

原因是容器未正确链接,如果您真的想在ECS中使用链接,则应在相同任务定义中定义两个容器,即每个任务定义两个容器,您< strong>无法链接来自两个不同任务定义的容器。

然后,您可以按照@linpy提到的容器引用mongo容器。

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

enter image description here

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

enter image description here

  

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

如果您创建

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

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