Сервис Django работает только при удалении и повторном извлечении изображения (в Swarm)

У меня есть кластер swarm с 2 рабочими и одним менеджером. Я создал образ Django, разместил его на Docker Hub. Я делаю миграции перед тем, как толкнуть образ, чтобы он содержал их.

Я извлекаю образ для использования его для сервисов Swarm, используя docker-compose, я развертываю стек, все работает. Но если я удаляю стек и пытаюсь запустить его снова из старого образа (который должен быть неизменным), я получаю psycopg2.OperationalError: could not translate host name "db" to address: Name or service not known.

Если я удаляю образ и просто запускаю стек снова (так что в основном я получаю тот же образ из Docker Hub), служба развертывается без каких-либо ошибок. Поэтому я не могу удалить стек и использовать тот же образ для повторного развертывания.

Моя композиция:

version: "3.3"
services:
  web:
    image: x
    command: >
      bash -c "python manage.py migrate && 
      python manage.py runserver 0.0.0.0:8000"
    env_file:
      - .env.dev
    volumes:
      - migrations-volume:/stack_name/api/migrations/
    deploy:
      replicas: 3
      restart_policy:
        condition: on-failure
    networks:
      - web_network
      - data_network
    secrets:
      - firebase_secret
      - google_cloud_secret
    healthcheck:
      test: wget --tries=1 --spider http://localhost:8000/app/ || exit 1
      interval: 180s
      retries: 5
      timeout: 10s

  db:
    image: postgres:11
    command: "-c logging_collector=on"
    volumes:
      - database:/var/lib/postgresql/database/
    env_file:
      - .env.database.dev
    networks:
      - data_network
    deploy:
      placement:
        constraints:
          - node.role == manager
      restart_policy:
        condition: any
    healthcheck:
      test: ["CMD-SHELL", "pg_isready"]
      interval: 30s
      timeout: 5s
      retries: 5

  frontend:
    image: x
    networks:
      - web_network
    env_file: .env.local
    deploy:
      replicas: 3
      restart_policy:
        condition: any
    healthcheck:
      test: wget --tries=1 --spider http://localhost:3000/ || exit 1
      interval: 180s
      retries: 5
      timeout: 10s

  nginx:
    image: nginx:stable-alpine
    deploy:
      placement:
        constraints:
          - node.role == manager
      restart_policy:
        condition: on-failure
    volumes:
      - ./reverse_proxy/nginx.conf:/etc/nginx/nginx.conf
      - /etc/letsencrypt:/etc/letsencrypt
      - /usr/share/nginx/html:/usr/share/nginx/html
    ports:
      - 80:80
      - 443:443
    networks:
      - web_network
      - data_network

secrets:
  firebase_secret:
    file: ./firebase-config.json
  google_cloud_secret:
    file: ./Google_Cloud_credentials.json

networks:
  web_network:
    driver: overlay
  data_network:
    driver: overlay

volumes:
  migrations-volume:
  database:

Я спросил около 15 разных людей и не смог найти решение, я пробовал делать миграции прямо перед развертыванием, не добавлять том, менять имя базы данных с "db" - но это не имеет смысла, потому что если я удаляю образы, он распознает "db". Спасибо!

Вернуться на верх