芹菜和烧瓶在相同的docker组成

我正在尝试使用docker-compose来产生我的Flask / Celery / Redis服务。

这是我docker-compose.yml

 flask: build: . command: "python3 app.py" ports: - '5000:5000' links: - redis volumes: - .:/usr/src/app:ro celery: build: . command: "celery -A app.celery worker --loglevel=info" volumes: - .:/usr/src/app:ro redis: image: redis ports: - '6379:6379' 

当我运行这个docker-compose ,Flask和Redis都可以正常运行,并且可以正常工作。 关于芹菜,Docker报告: flaskcelery_celery_1 exited with code 1 ,没有其他信息。

如果我在没有Docker的情况下运行我的三个服务,并使用celery -A app.celery worker --loglevel=info启动Celery,那么我的应用程序function就好了。

一些更多的信息,如果有必要:

Dockerfile :(这个图片也在build上安装requirements.txt

 FROM python:3.5-onbuild EXPOSE 5000 

requirements.txt:

 flask==0.11.1 celery==3.1.23 

docker-compose up输出:

 Starting flaskcelery_celery_1 Starting flaskcelery_redis_1 Starting flaskcelery_flask_1 Attaching to flaskcelery_celery_1, flaskcelery_redis_1, flaskcelery_flask_1 redis_1 | _._ redis_1 | _.-``__ ''-._ redis_1 | _.-`` `. `_. ''-._ Redis 3.2.3 (00000000/0) 64 bit redis_1 | .-`` .-```. ```\/ _.,_ ''-._ redis_1 | ( ' , .-` | `, ) Running in standalone mode redis_1 | |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 redis_1 | | `-._ `._ / _.-' | PID: 1 redis_1 | `-._ `-._ `-./ _.-' _.-' redis_1 | |`-._`-._ `-.__.-' _.-'_.-'| redis_1 | | `-._`-._ _.-'_.-' | http://redis.io redis_1 | `-._ `-._`-.__.-'_.-' _.-' redis_1 | |`-._`-._ `-.__.-' _.-'_.-'| redis_1 | | `-._`-._ _.-'_.-' | redis_1 | `-._ `-._`-.__.-'_.-' _.-' redis_1 | `-._ `-.__.-' _.-' redis_1 | `-._ _.-' redis_1 | `-.__.-' redis_1 | redis_1 | 1:M 23 Aug 10:23:08.409 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128. redis_1 | 1:M 23 Aug 10:23:08.409 # Server started, Redis version 3.2.3 redis_1 | 1:M 23 Aug 10:23:08.409 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. redis_1 | 1:M 23 Aug 10:23:08.409 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled. redis_1 | 1:M 23 Aug 10:23:08.409 * The server is now ready to accept connections on port 6379 flaskcelery_celery_1 exited with code 1 flask_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) flask_1 | * Restarting with stat flask_1 | * Debugger is active! flask_1 | * Debugger pin code: 196-119-737 

解决了我的问题。 我最终发现我可以在Docker镜像上得到一个命令提示符:

 docker build -t <image name> . docker run -it <image name> /bin/bash 

然后试图在容器内运行celery显示问题:

 root@4a6edc5d7372:/usr/src/app# celery -A app.celery worker --loglevel=info Running a worker with superuser privileges when the worker accepts messages serialized with pickle is a very bad idea! If you really want to continue then you have to set the C_FORCE_ROOT environment variable (but please think about this before you do). User information: uid=0 euid=0 gid=0 egid=0 

Docker通常以root身份运行,而且由于安全原因,Celery不会像root一样运行(我相信你可以通过pickle反序列化来获得代码执行)。 更安全的解决办法是把celery容器放在nobody 。 工作docker-compose.yml

 flask: build: . command: "python3 app.py" ports: - '5000:5000' links: - redis - celery volumes: - .:/usr/src/app:ro celery: build: . command: "celery -A app.celery worker --loglevel=info" user: nobody links: - redis volumes: - .:/usr/src/app:ro redis: image: redis ports: - '6379:6379' 
Interesting Posts