Python Celery 试图在 docker-compose 中占用一个端口号并产生问题

标签 python python-3.x docker docker-compose celery

docker -compose.yml:

  python-api: &python-api
    build:
      context: /Users/AjayB/Desktop/python-api/
    ports:
      - "8000:8000"
    networks:
      - app-tier
    expose:
      - "8000"
    depends_on:
      - python-model
    volumes:
      - .:/python_api/
    environment:
      - PYTHON_API_ENV=development
    command: >
      sh -c "ls /python-api/ &&
             python_api_setup.sh development
             python manage.py migrate &&
             python manage.py runserver 0.0.0.0:8000"

  python-model: &python-model
    build:
      context: /Users/AjayB/Desktop/Python/python/
    ports:
      - "8001:8001"
    networks:
      - app-tier
    environment:
      - PYTHON_API_ENV=development
    expose:
      - "8001"
    volumes:
      - .:/python_model/
    command: >
      sh -c "ls /python-model/
             python_setup.sh development
             cd /server/ &&
             python manage.py migrate &&
             python manage.py runserver 0.0.0.0:8001"

  python-celery:
    <<: *python-api
    environment:
      - PYTHON_API_ENV=development
    networks:
      - app-tier
    links:
      - redis:redis
    depends_on:
      - redis
    command: >
      sh -c "celery -A server worker -l info"

  redis:
    image: redis:5.0.8-alpine
    hostname: redis
    networks:
          - app-tier
    expose:
      - "6379"
    ports:
      - "6379:6379"
    command: ["redis-server"]
python-celery在里面 python-api它应该作为一个单独的容器运行。但它试图占用与 python-api 相同的端口, 绝不应该是这样。

我得到的错误是:
AjayB$ docker-compose up
Creating integrated_redis_1        ... done
Creating integrated_python-model_1 ... done
Creating integrated_python-api_1   ... 
Creating integrated_python-celery_1 ... error

Creating integrated_python-api_1    ... done
e1d1055165b1f85f179f69c): Bind for 0.0.0.0:8000 failed: port is already allocated

ERROR: for python-celery  Cannot start service python-celery: driver failed programming external connectivity on endpoint integrated_python-celery_1 (ab5e079dbc3a30223e16052f21744c2b5dfc56adbe1d1055165b1f85f179f69c): Bind for 0.0.0.0:8000 failed: port is already allocated
ERROR: Encountered errors while bringing up the project.

在做docker ps -a ,我明白了:
AjayB$ docker ps -a
CONTAINER ID        IMAGE                      COMMAND                  CREATED             STATUS                      PORTS                    NAMES
2ff1277fb7a7        integrated_python-celery   "sh -c 'celery -A se…"   10 seconds ago      Created                                              integrated_python-celery_1
5b60221b42a4        integrated_python-api      "sh -c 'ls /crackd-a…"   11 seconds ago      Up 9 seconds                0.0.0.0:8000->8000/tcp   integrated_python-api_1
bacd8aa3268f        integrated_python-model    "sh -c 'ls /crackd-m…"   12 seconds ago      Exited (2) 10 seconds ago                            integrated_python-model_1
9fdab833b436        redis:5.0.8-alpine         "docker-entrypoint.s…"   12 seconds ago      Up 10 seconds               0.0.0.0:6379->6379/tcp   integrated_redis_1

尝试强制移除容器并尝试 docker-compose up得到同样的错误。 :/我在哪里犯错了?
只是怀疑volumes:部分。谁能告诉我volumes是正确的?
请帮我解决这个错误。 PS,先试试docker。
谢谢!

最佳答案

这是因为你重用了 python-api 的完整配置。包括 ports将暴露端口 8000 的部分(顺便说一下,expose 是多余的,因为您的 ports 部分已经暴露了端口)。

我将创建一个可供任何服务使用的公共(public)部分。在你的情况下,它会是这样的:

version: '3.7'

x-common-python-api:
   &default-python-api
    build:
      context: /Users/AjayB/Desktop/python-api/
    networks:
      - app-tier
    environment:
      - PYTHON_API_ENV=development
    volumes:
      - .:/python_api/

services:

  python-api:
    <<: *default-python-api
    ports:
      - "8000:8000"
    depends_on:
      - python-model
    command: >
      sh -c "ls /python-api/ &&
             python_api_setup.sh development
             python manage.py migrate &&
             python manage.py runserver 0.0.0.0:8000"

  python-model: &python-model
     .
     .
     .

  python-celery:
    <<: *default-python-api
    links:
      - redis:redis
    depends_on:
      - redis
    command: >
      sh -c "celery -A server worker -l info"

  redis:
     .
     .
     .

关于Python Celery 试图在 docker-compose 中占用一个端口号并产生问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60853414/

相关文章:

python - 在Python中的try语句后引发更合适的错误?

Python 3 键盘中断多线程

amazon-web-services - 如何在AWS Lambda上安装fontconfig?

Docker Hub更新通知

linux - 如何从命令行更新 Helm Chart.yaml

python - 将两组间隔合并为一组间隔

python - 如何在python程序中比较非英文(中文)字符?

python - 如何读取通过 Python 中的 subprocess.popen 生成的文件的输出?

python-3.x - 文件未找到错误: [WinError 3] The system cannot find the path specified:

python-3.x - 如何在 python 中找到方差膨胀因子以及 VIF 函数中的参数应该是什么?