Python Celery пытается занять номер порта в docker -создать и создает проблемы - PullRequest
1 голос
/ 25 марта 2020

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. Спасибо!

Ответы [ 2 ]

1 голос
/ 26 марта 2020

В этом файле docker-compose.yml есть много, но большая его часть не нужна. expose: в Dockerfile почти ничего не делает; links: не нужны в текущей сетевой системе; Compose предоставляет сеть default для вас; ваш volumes: попытается вставить код в контейнер, который уже должен присутствовать на изображении. Если вы очистите все это, единственная часть, которую вы действительно хотите повторно использовать из одного контейнера в другой, это его build: (или image:), и в этот момент синтаксис привязки YAML не нужен.

Этот docker-compose.yml должен быть функционально эквивалентен тому, что показано в вопросе:

version: '3'
services:
  python-api:
    build:
      context: /Users/AjayB/Desktop/python-api/
    ports:
      - "8000:8000"
    # No networks:, use `default`
    # No expose:, use what's in the Dockerfile (or nothing)
    depends_on:
      - python-model
    # No volumes:, use what's in the Dockerfile
    # No environment:, this seems to be a required setting in the Dockerfile
    # No command:, use what's in the Dockerfile

  python-model:
    build:
      context: /Users/AjayB/Desktop/Python/python/
    ports:
      - "8001:8001"

  python-celery:
    build: # copied from python-api
      context: /Users/AjayB/Desktop/python-api/
    depends_on:
      - redis
    command: celery -A server worker -l info # one line, no sh -c wrapper

  redis:
    image: redis:5.0.8-alpine
    # No hostname:, it doesn't do anything
    ports:
      - "6379:6379"
    # No command:, use what's in the image

Опять же, обратите внимание, что единственное, что мы фактически скопировали из контейнера python-api в python-celery контейнер - это блок build:; все остальные параметры, которые будут совместно использоваться двумя контейнерами (код, открытые порты), включены в Dockerfile, который описывает, как построить образ.

Обратная сторона этого заключается в том, что вам нужно убедитесь, что все эти настройки действительно включены в ваш Dockerfile:

# Copy the application code in
COPY . .

# Set the "development" environment variable
ENV PYTHON_API_ENV=development

# Document which port you'll use by default
EXPOSE 8000

# Specify the default command to run
# (Consider writing a shell script with this content instead)
CMD python_api_setup.sh development && \
    python manage.py migrate && \
    python manage.py runserver 0.0.0.0:8000
1 голос
/ 25 марта 2020

Это потому, что вы повторно используете полную конфигурацию python-api, включая секцию ports, которая открывает порт 8000 (кстати, 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:
     .
     .
     .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...