2015-11-30 15 views
34

Django Quick Start instructions on the Docker site'u takip ederek bir Docker Django/PostgreSQL uygulamasını kurdum.Docker-Compose'u kullanırken Django veritabanı geçişlerini nasıl gerçekleştirirsiniz?

Django'nun manage.py geçişini ilk kez çalıştırdığımda, sudo docker-compose run web python manage.py migrate komutunu kullanarak beklendiği gibi çalışır. Veritabanı Docker PostgreSQL konteynerinin içine yerleştirilmiştir.

Django uygulamasının kendisinde yapılan değişiklikler de, Docker Django kapsayıcısında, onları kaydeddiğim anda yansıtılır. Bu harika! Sonra Django modelini değiştirmek, ve modelini maç için Postgres'e veritabanını güncellemek çalışırsanız

Ama hiçbir değişiklik tespit edilirse hiçbir göç olursa olsun ben yine makemigrations veya migrate çalıştırmak kaç kez olur.

Temel olarak, Django modelini her değiştirdiğimde, Docker kapsayıcılarını (sudo docker-compose rm kullanarak) silmeli ve yeni bir geçişle yeniden başlamalıyım.

Hala kafamı Docker'a sokmaya çalışıyorum ve bunun nasıl çalıştığını anlamadığım korkunç bir şey var, ama bu beni deli ediyor. Neden geçişimi değiştirmiyorsunuz? Neyi yanlış yapıyorum?

+0

nedenini anlamaya mı? Aşağıdaki cevabı alıyorum ve çalışıyor: “Çalışan docker konteynerinize giriş yapmalı ve komutlarınızı çalıştırmalısınız”, ancak bu şekilde davranmasının nedeni [email protected] – lukik

cevap

36

Sadece çalışan docker kabına giriş yapmalı ve komutlarınızı çalıştırmalısınız.

  1. sizin yığını oluşturun: docker-compose build -f path/to/docker-compose.yml
  2. başlatın yığını: docker-compose up -f path/to/docker-compose.yml
  3. Ekran liman işçisi çalıştıran konteynerler: 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 ... 
  • alın KONTEYNERE
      ID you django app ve giriş yapın:
    docker exec -t -i 66175bfd6ae6 bash 
    
  • Şimdi

    sonra sağ klasörüne gidin, giriş yaptığınız

      : Şimdi cd path/to/django_app

    1. Ve Modelleri düzenlemek her zaman, çalıştırmak senin kap: python manage.py makemigrations ve python manage.py migrate

    Ben de otomatik olarak çalıştırmak için django liman işçisi konteyner dosyası için bir liman işçisi-giriş noktasını kullanmak önerilir:

    • collecstatic
    • runserver
    • yer değiştirme ya da gunicorn ile başlar veya uWSGI Burada

  • bir örnek (docker-entrypoint.sh) 'dir:

    #!/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 
    
    +4

    * Ayrıca, otomatik olarak çalışması için django docker konteyner dosyanız için bir docker-giriş noktası kullanmanızı öneririm * - bu tür işlemler asla otomatik olarak çalıştırılmamalıdır - özellikle * migrate *. – Opal

    +0

    neden bu? geliştirme ortamındayız. –

    +4

    Hangi ortamda olduğunuzu farketmez - dağıtım her zaman aynı görünmelidir. Göçler otomatikse, eş zamanlı olarak çalıştırılabilir ve bu da son derece cesaret kırıcıdır. Örneğin. heroku'da - geçişler asla dağıtımın bir parçası olarak çalıştırılmaz. – Opal

    17

    Bunları yöntemi kullanın: Ana hizmet çalıştırmak için önce

    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 
    

    Yaptığımız docker hiyerarşiyi kullanarak hizmet göç sonrasında veritabanını kurmak ve çalışır. Artık hizmetinizi çalıştırdığınızda docker, sunucuyu çalıştırmadan önce geçişleri çalıştıracak; migration sunucusunun web sunucusundaki aynı görüntüye uygulandığını görünce, tüm geçişlerin projenizden alınacağı ve sorunlardan kaçınacağı anlamına gelir.

    Giriş noktasından veya bu yolla başka bir şeyden kaçındınız.

    +0

    Nasıl yapılacağı:: 'görüntü ile çalışmak:' Göç, adlandırılan görüntüyü çekemediğinde hata alıyorum –

    +0

    Gönderiyi 'build: 'üzerine koyarak çözdüm 'web’den önce çalışacağından –

    0

    Biraz eski bir konu. Ama şimdiye kadar listelenmeyen başka bir yöntem var.

    Yığınınızın çalışmasını sağlayın, ardından tek bir atış docker-compose komutunu çalıştırın. Örn

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

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

    İlgili konular