ডকার-কম্পোজ ব্যবহার করার সময় আপনি কীভাবে জ্যাঙ্গো ডাটাবেস স্থানান্তর করেন?


110

আমি ডকার সাইটে জ্যাঙ্গো কুইক স্টার্ট নির্দেশাবলী অনুসরণ করে একটি ডকার জাঙ্গো / পোস্টগ্রিএসকিউএল অ্যাপ সেট আপ করেছি set

কমান্ডটি ব্যবহার করে আমি প্রথম জাঙ্গোর পরিচালন.পি মাইগ্রেশন চালাই sudo docker-compose run web python manage.py migrate , এটি প্রত্যাশার মতো কাজ করে। ডাটাবেসটি ডকার পোস্টগ্র্রেএসকিউএল কনটেইনার ঠিক ঠিকঠাক করে তৈরি করা হয়েছে।

জ্যাঙ্গো অ্যাপ্লিকেশনটিতে নিজেই করা পরিবর্তনগুলি একইভাবে ডকার জাঙ্গো ধারকটিতে প্রতিফলিত হয়, আমি যে মুহুর্তে সেগুলি সংরক্ষণ করি। এটা দুর্দান্ত!

তবে আমি যদি পরে জ্যাঙ্গোতে কোনও মডেল পরিবর্তন করি এবং মডেলটির সাথে মেলে পোস্টগ্র্রেস ডাটাবেস আপডেট করার চেষ্টা করি তবে কোনও পরিবর্তন সনাক্ত করা যায়নি তাই আমি যতবার চালাই makemigrationsবা migrateআবার চালিয়ে যাই না কেন কোনও স্থানান্তর ঘটে না ।

মূলত, যতবারই আমি জ্যাঙ্গো মডেলটি পরিবর্তন করি, আমাকে ডকারের পাত্রে মুছে ফেলতে হবে (ব্যবহার করে sudo docker-compose rm) এবং নতুন স্থানান্তর নিয়ে নতুন করে শুরু করতে হবে।

আমি এখনও ডকারকে ঘিরে আমার মাথা নেওয়ার চেষ্টা করছি, এবং এটি কীভাবে কাজ করে তা সম্পর্কে আমি বুঝতে পারি না এমন একটি ভয়ঙ্কর অনেক কিছুই আছে তবে এই ব্যক্তিটি আমাকে বাদাম চালাচ্ছে। আমার পরিবর্তনগুলি মাইগ্রেট করে না কেন? আমি কি ভুল করছি?


আপনি বুঝতে পেরেছিলেন কেন? আমি নীচে উত্তর পেয়েছি এবং এটি কার্যকর হয়: You just have to log into your running docker container and run your commands.তবে এটি এমনভাবে আচরণ করার কারণ কী? @
লুইস

উত্তর:


115

আপনাকে কেবল আপনার চলমান ডকার পাত্রে লগইন করতে হবে এবং আপনার আদেশগুলি চালাতে হবে।

  1. আপনার স্ট্যাক তৈরি করুন: docker-compose build -f path/to/docker-compose.yml
  2. আপনার স্ট্যাক চালু করুন: docker-compose up -f path/to/docker-compose.yml
  3. ডকার চলমান ধারকগুলি প্রদর্শন করুন: docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                         NAMES
3fcc49196a84        ex_nginx          "nginx -g 'daemon off"   3 days ago          Up 32 seconds       0.0.0.0:80->80/tcp, 443/tcp   ex_nginx_1
66175bfd6ae6        ex_webapp         "/docker-entrypoint.s"   3 days ago          Up 32 seconds       0.0.0.0:32768->8000/tcp       ex_webapp_1
# postgres docker container ...
  1. জাঙ্গো অ্যাপ্লিকেশনটির কনটেনার আইডি পান এবং লগ ইন করুন:
docker exec -t -i 66175bfd6ae6 bash
  1. এখন আপনি লগ ইন করেছেন, তারপরে ডান ফোল্ডারে যান: cd path/to/django_app

  2. এবং এখন, প্রতিবার আপনি আপনার মডেলগুলি সম্পাদনা করুন, আপনার পাত্রে চালান: python manage.py makemigrationsএবংpython manage.py migrate

আমি আপনাকে জাজো ডকার কনটেইনার ফাইলটি স্বয়ংক্রিয়ভাবে চালানোর জন্য ডকার-এন্ট্রি পয়েন্ট ব্যবহার করার পরামর্শ দিচ্ছি:

  • সমষ্টিগত
  • মাইগ্রেট
  • রানসারবার বা এটি গিনিকর্ন বা uWSGI দিয়ে শুরু করুন

এখানে একটি উদাহরণ ( docker-entrypoint.sh):

#!/bin/bash

# Collect static files
echo "Collect static files"
python manage.py collectstatic --noinput

# Apply database migrations
echo "Apply database migrations"
python manage.py migrate

# Start server
echo "Starting server"
python manage.py runserver 0.0.0.0:8000

16
আমি আপনাকে স্বয়ংক্রিয়ভাবে চালানোর জন্য আপনার জাঙ্গো ডকার কনটেইনার ফাইলটির জন্য ডকার-এন্ট্রি পয়েন্ট ব্যবহার করার পরামর্শ দিচ্ছি - এই জাতীয় ক্রিয়াকলাপগুলি কখনই স্বয়ংক্রিয়ভাবে চালানো উচিত নয় - মানে বিশেষত স্থানান্তরিত হওয়া
ওপাল

7
আপনি কোন পরিবেশের বিষয়ে তা বিবেচ্য নয় - স্থাপনার ক্ষেত্রে সর্বদা একই দেখানো উচিত। মাইগ্রেশন যদি স্বয়ংক্রিয় হয় তবে সম্ভবত একই সাথে চালানো যেতে পারে যা অত্যন্ত নিরুত্সাহিত। যেমন হিরকুতে - স্থানান্তরগুলি মোতায়েনের অংশ হিসাবে কখনও চালিত হয় না।
ওপল

4
একযোগে? এখানে আমরা একটি দেব vর্ষা হয়। আমি দৌড়াচ্ছি makemigrations। পরের বার যখন আমি আমার স্ট্যাক চালু করব, migrateশেষ মাইগ্রেশন পূর্বাবস্থায় ফিরিয়ে নিয়ে ডাটাবেস আপডেট করবে, অন্যথায় জাজানো অ্যাপ্লিকেশনটি সঠিকভাবে কাজ করবে না ... এটি বর্তমান ডিভাইসটির সাথে সঠিক ডাটাবেস স্কিমা পেয়েছে তা নিশ্চিত হওয়ার জন্য এটি কেবলমাত্র একটি শর্টকাট
লুই বারানকিরো

4
লুইস বারানকিরো, আমার অর্থ একাধিক উদাহরণ, একক ডিবি।
ওপল

4
চতুর্থ ধাপের জন্য, আমি সুপারিশ করব: ডকার এক্সিকিউটিটি-কন্টিনআইএনআইডিআইডি / বিন / এস
সান্তিয়াগো মাগারিওস

51

আমি এই পদ্ধতি ব্যবহার করি:

services:
  web:
    build: .
    image: uzman
    command: python manage.py runserver 0.0.0.0:8000
    ports:
      - "3000:3000"
      - "8000:8000"
    volumes:
      - .:/code
    depends_on:
      - migration
      - db
  migration:
    image: uzman
    command: python manage.py migrate --noinput
    volumes:
      - .:/code
    depends_on:
      - db

dockerআমরা তৈরি হায়ারার্কি ব্যবহার করে, ডেটাবেস সেটআপ করার পরে এবং মূল পরিষেবা চালানোর আগে পরিষেবা স্থানান্তর চলে। এখন আপনি যখন সার্ভিসটি dockerচালাবেন তখন সার্ভার চালানোর আগে মাইগ্রেশন চলবে; ওটা দেখmigration ওয়েব সার্ভারটি একই চিত্রের উপরে সার্ভারটি প্রয়োগ করা হয়েছে, তার অর্থ সমস্যাগুলি এড়িয়ে সমস্ত প্রকল্পগুলি আপনার প্রকল্প থেকে নেওয়া হবে।

আপনি এন্ট্রি পয়েন্ট বা অন্য যে কোনও জিনিস এইভাবে এড়িয়ে চলুন।


4
কেমন করে build: .দিয়ে কাজ image: আমি যে মাইগ্রেশন নামে ইমেজ টান করতে পারবে না ভুল পান
হারুন McMillin

4
এটি build:চালিয়ে যাওয়ার migrationপরে আমি এটি সমাধান করে দিয়েছি যেহেতু এটি আগে চলবেweb
অ্যারন ম্যাকমিলিন

4
এটি কি চিরদিনের জন্য উজমান চিত্রটি চলমান এবং র‌্যাম গ্রহণ করে না? এছাড়াও, কি হল uzman ইমেজ?
mlissner

এটি আমার কাস্টম ডকার ইমেজ। আমি এখনও র‌্যাম পরীক্ষা করি নি।
SalahAdDin

33

আপনার স্ট্যাকটি চলমান থাকে তারপরে একটি শট ডকার-কমপোজ রান কমান্ড বন্ধ করে দিন। যেমন

#assume django in container named web
docker-compose run web python3 manage.py migrate

এটি অন্তর্নির্মিত (ডিফল্ট) এসকিউএল ডাটাবেস, তবে নির্ভরতা হিসাবে তালিকাভুক্ত একটি বহিরাগত ডকারাইজড ডাটাবেসের জন্য দুর্দান্ত কাজ করে। এখানে একটি উদাহরণ ডকার-কমপোজ.আইএমএল ফাইল

version: '3'

services:
  db:
    image: postgres
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

https://docs.docker.com/compose/references/run/


12

আপনি docker execকমান্ড ব্যবহার করতে পারেন

docker exec -it container_id python manage.py migrate

4
এই উত্তর হওয়া উচিত।
টোলগা

উল্লিখিত ধারক_টি পেতে, docker psএবং তারপরে জাঙ্গো সার্ভারের জন্য COMMAND কলামটি দেখুন।
জয় শর্মা

6

আপনার মধ্যে যদি এরকম কিছু থাকে docker-compose.yml

version: "3.7"

services:

  app:
    build:
      context: .
      dockerfile: docker/app/Dockerfile
    ports:
    - 8000:8000
    volumes:
        - ./:/usr/src/app
    depends_on:
      - db

  db:
    image: postgres
    restart: always
    environment:
      POSTGRES_USER: docker
      POSTGRES_PASSWORD: docker
      POSTGRES_DB: docker

তারপরে আপনি সহজ রান করতে পারেন ...

~$ docker-compose exec app python manage.py makemigrations
~$ docker-compose exec app python manage.py migrate

3

আমি জানি এটি পুরানো, এবং সম্ভবত আমি এখানে কিছু মিস করছি (যদি তা হয় তবে দয়া করে আমাকে আলোকিত করুন!), তবে start.shডকারের দ্বারা চালিত আপনার দৃষ্টিকোণগুলি চালানোর জন্য কমান্ডগুলি কেন যুক্ত করবেন না ? এতে মাত্র কয়েক সেকেন্ড সময় লাগবে।

DJANGO_SETTINGS_MODULEউন্নয়ন এবং উত্পাদনের জন্য আমি বিভিন্ন উপাত্ত ব্যবহার করি (যদিও আমি জানি এটি 'সেরা অনুশীলন' নয়) এনবি আমি ভেরিয়েবলটি সঠিক ডেটাবেস ব্যবহার করা হয়েছে তা নিশ্চিত করার জন্য সেট করেছিলাম ।

এটি আমার জন্য এটি সমাধান করেছে:

#!/bin/bash
# Migrate the database first
echo "Migrating the database before starting the server"
export DJANGO_SETTINGS_MODULE="edatool.settings.production"
python manage.py makemigrations
python manage.py migrate
# Start Gunicorn processes
echo "Starting Gunicorn."
exec gunicorn edatool.wsgi:application \
    --bind 0.0.0.0:8000 \
    --workers 3

1

ডকার এক্সেকে ব্যবহার করে, আমি নিম্নলিখিত ত্রুটিটি পেয়েছিলাম:

AppRegistryNotReady("Models aren't loaded yet.")

সুতরাং আমি পরিবর্তে এই আদেশ ব্যবহার করেছি:

docker-compose -f local.yml run django python manage.py makemigrations
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.