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