我有一个可与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'
答案 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容器。
因此您的容器任务定义将如下所示
并更新python容器的任务定义中的链接部分,或使用注释中提到的JSON。
这是否意味着我必须在集群中创建另一个容器以用于 MongoDB?
如果您创建
然后在上述情况下,链接将不起作用,那么您必须使用service discovery或内部LB。