Python芹菜试图占据docker compose中的端口号并产生问题

Python芹菜试图占据docker compose中的端口号并产生问题,python,python-3.x,docker,docker-compose,celery,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:

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"]
在做
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
获得相同错误。:/我哪里出错了? 只是怀疑
卷:
部分。有谁能告诉我
是否正确吗?
请帮我纠正这个错误。PS,先试试docker。

谢谢

这是因为您重新使用了
pythonapi
的完整配置,包括将公开端口8000的
ports
部分(顺便说一下,
expose
是多余的,因为您的
ports
部分已经公开了端口)

我将创建一个可供任何服务使用的公共部分。在您的情况下,可能是这样的:

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:
     .
     .
     .
版本:“3.7”
x-common-python-api:
&默认python api
建造:
上下文:/Users/AjayB/Desktop/pythonapi/
网络:
-应用层
环境:
-PYTHON\u API\u ENV=开发
卷数:
-.:/python\u api/
服务:
python api:

docker compose.yml文件中有很多内容,但大部分内容都是不必要的<代码>公开:
在Dockerfile中几乎什么都不做<代码>链接:
当前网络系统不需要链接;Compose为您提供一个
默认
网络;您的
卷:
尝试将代码注入到映像中应该已经存在的容器中。如果您清理了所有这些,那么您真正想从一个容器重用到另一个容器的唯一部分就是它的
构建:
(或
图像:
),此时YAML锚语法是不必要的

docker compose.yml
在功能上应与您在问题中显示的内容等效:

版本:“3”
服务:
python api:
建造:
上下文:/Users/AjayB/Desktop/pythonapi/
端口:
- "8000:8000"
#无网络:,请使用“默认值”`
#不公开:,使用Dockerfile中的内容(或不公开)
取决于:
-python模型
#无卷:,使用Dockerfile中的内容
#无环境:,这似乎是Dockerfile中的必需设置
#无命令:,使用Dockerfile中的内容
python模型:
建造:
上下文:/Users/AjayB/Desktop/Python/Python/
端口:
- "8001:8001"
蟒蛇芹菜:
构建:#从python api复制
上下文:/Users/AjayB/Desktop/pythonapi/
取决于:
-雷迪斯
命令:芹菜-服务器工作者-l信息#一行,无sh-c包装
redis:
图片:redis:5.0.8-alpine
#没有主机名:,它什么都不做
端口:
- "6379:6379"
#无命令:,使用图像中的内容
再次注意,我们实际上从
pythonapi
容器复制到
pythonseclery
容器的唯一内容是
build:
块;将在两个容器(代码、公开端口)之间共享的所有其他设置都包含在描述如何构建映像的
Dockerfile

另一方面,您需要确保所有这些设置实际上都包含在您的
Dockerfile
中:

#将应用程序代码复制到
复制
#设置“开发”环境变量
ENV PYTHON\u API\u ENV=开发
#记录默认情况下将使用的端口
曝光8000
#指定要运行的默认命令
#(考虑使用此内容编写shell脚本)
CMD python_api_setup.sh开发和\
python manage.py迁移&&\
python manage.py运行服务器0.0.0.0:8000

乍一看,您的方法似乎很合理,应该能按预期工作。但是,我不清楚您使用YAML锚的别名。我认为您正在尝试在服务之间创建引用,但是,您可以从其他容器通过DNS名称
python-api
引用,例如
python-api
。请删除YAML锚和别名,然后尝试不使用。
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:
     .
     .
     .