2016-08-23 44 views
10

我想用docker-compose來產生我的燒瓶/芹菜/ 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,既瓶和Redis的啓動精細和功能的預期。關於芹菜,Docker報告:flaskcelery_celery_1 exited with code 1,沒有其他信息。

如果我在沒有Docker的情況下運行我的三項服務,並啓動celery -A app.celery worker --loglevel=info的芹菜,我的應用程序功能就好了。

一些更多的信息,如果需要的話:

Dockerfile:(此圖像上構建安裝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 

回答

9

解決了我的問題。我終於想通了,我能得到多克爾圖像上的命令提示符:

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

然後試圖將容器內運行celery道出了問題:

[email protected]:/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 

碼頭工人通常以root身份運行,和芹菜沒有按因爲安全原因,我不喜歡以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'