Docker Compose memberikan kesalahan ModuleNotFoundError: No module named 'django'. Docker Compose belum menginstal paket pip yang diinstal pip install -r requirements.txt tetapi menjalankan gambar dengan cara lain menunjukkan bahwa mereka diinstal dan masalah ini hanya dengan docker-compose, mengapa?

Tulis

version: '3.8'

services:
  web:
    build: ./
    user: python
    volumes:
      - ./:/app
    ports:
      - 8000:8000
    env_file:
      - ./.env.dev

Dockerfile

# Base image  
FROM python:3.9.6

ENV HOME=/app

# create directory for the app user
RUN mkdir -p $HOME

# set work directory
WORKDIR $HOME
 
# install psycopg2 dependencies
RUN apt-get update \
    && apt-get -y install libpq-dev gcc \
    && pip install psycopg2 \
    && apt-get -y install gunicorn3

RUN pip install --upgrade pip
ADD requirements*.txt .
RUN pip install -r requirements.txt
COPY python . .

ENTRYPOINT ["/app/entrypoint.sh"]

EXPOSE 8000

Masalah:

Saya telah membuat Dockerfile berikut yang berjalan dalam produksi dan bahkan berjalan secara lokal di luar docker-compose tanpa masalah apa pun, yaitu yang berikut ini berfungsi tanpa kesalahan docker run -p 8000:8000 web/lastest.

Namun, ketika saya menjalankan ini melalui docker-compose gagal menemukan paket pip yang saya instal.

Sebagai contoh:

  • pembuatan docker-compose (berhasil)
  • docker-compose up

Kesalahan

web_1  | ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to activate a virtual environment?
web_1  | [2022-01-04 14:55:05 +0000] [1] [INFO] Starting gunicorn 20.1.0
web_1  | [2022-01-04 14:55:05 +0000] [1] [INFO] Listening at: http://0.0.0.0:8000 (1)
web_1  | [2022-01-04 14:55:05 +0000] [1] [INFO] Using worker: sync
web_1  | [2022-01-04 14:55:05 +0000] [8] [INFO] Booting worker with pid: 8
web_1  | [2022-01-04 14:55:05 +0000] [8] [ERROR] Exception in worker process
web_1  | Traceback (most recent call last):
web_1  |   File "/usr/lib/python3/dist-packages/gunicorn/arbiter.py", line 589, in spawn_worker
web_1  |     worker.init_process()
web_1  |   File "/usr/lib/python3/dist-packages/gunicorn/workers/base.py", line 134, in init_process
web_1  |     self.load_wsgi()
web_1  |   File "/usr/lib/python3/dist-packages/gunicorn/workers/base.py", line 146, in load_wsgi
web_1  |     self.wsgi = self.app.wsgi()
web_1  |   File "/usr/lib/python3/dist-packages/gunicorn/app/base.py", line 67, in wsgi
web_1  |     self.callable = self.load()
web_1  |   File "/usr/lib/python3/dist-packages/gunicorn/app/wsgiapp.py", line 58, in load
web_1  |     return self.load_wsgiapp()
web_1  |   File "/usr/lib/python3/dist-packages/gunicorn/app/wsgiapp.py", line 48, in load_wsgiapp
web_1  |     return util.import_app(self.app_uri)
web_1  |   File "/usr/lib/python3/dist-packages/gunicorn/util.py", line 384, in import_app
web_1  |     mod = importlib.import_module(module)
web_1  |   File "/usr/lib/python3.9/importlib/__init__.py", line 127, in import_module
web_1  |     return _bootstrap._gcd_import(name[level:], package, level)
web_1  |   File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
web_1  |   File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
web_1  |   File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
web_1  |   File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
web_1  |   File "<frozen importlib._bootstrap_external>", line 790, in exec_module
web_1  |   File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
web_1  |   File "/app/app/wsgi.py", line 12, in <module>
web_1  |     from django.core.wsgi import get_wsgi_application
web_1  | ModuleNotFoundError: No module named 'django' 

Menjalankan which python output /usr/local/bin/python pada menjalankan gambar secara langsung dan menggunakan docker-compose.

Menjalankan docker run -it 43d991d65c02 /bin/bash Saya dapat melihat dan menjalankan Django. Hanya ketika menjalankan docker-compose Django tidak diinstal, mengapa?

0
MarkK 4 Januari 2022, 18:09
3
Anda mengganti direktori /app dalam wadah dengan volume mount saat runtime.
 – 
Turing85
4 Januari 2022, 18:14
Yah, itu konyol bagiku. Saya tidak tahu volume akan menghapus paket yang diinstal di sistem OS buruh pelabuhan. Senang kecuali Anda menjawab
 – 
MarkK
4 Januari 2022, 18:16
Seharusnya tidak Django di requirements.txt?
 – 
Beppe C
4 Januari 2022, 18:18
1
Itu tergantung di mana paket diinstal. Jika kita memasang direktori melalui pemasangan volume, direktori wadah yang dikonfigurasi adalah "ditimpa". Jika direktori wadah ini berisi modul yang diinstal, maka ya, modul tersebut hilang. Bisakah Anda memeriksa apakah a) menghapus volume mount atau b) menjalankan kembali pip install -r requirements.txt pada container-startup memperbaiki masalah?
 – 
Turing85
4 Januari 2022, 18:18
Terima kasih @ Turing85 ketika saya menghapus volume, ini sekarang berfungsi. Saya hanya ingin membuat perubahan secara lokal dan memperbarui wadah yang sedang berjalan. Saya kira saya salah mengerti apa fungsinya
 – 
MarkK
4 Januari 2022, 18:22

2 jawaban

Jawaban Terbaik

Dalam containerfile yang disajikan, kami bekerja di direktori container /app. Namun saat runtime, kami memasang volume ke /app. Oleh karena itu, semua konten yang dihasilkan selama waktu pembuatan gambar yang disimpan di /app ditimpa oleh pemasangan volume. Jika dependensi saat runtime dipasang di /app, maka dependensi tersebut akan ditimpa oleh volume mount.

Untuk memperbaiki masalah ini, dua kemungkinan muncul di benak saya:

  1. Kami dapat menghapus mount volume. Ini akan, bagaimanapun, tanpa kita dari kemampuan "reload panas".

  2. Kita dapat menjalankan kembali pip install -r requirements.txt pada startup container, sebelum memulai aplikasi. Ini berarti menambahkan baris pip install -r requirements.txt ke skrip entrypoint.sh.

2
Turing85 4 Januari 2022, 18:24
Apakah ada opsi ke-3 agar persyaratan dipasang di tempat yang berbeda selama proses pembuatan buruh pelabuhan dan volume tidak menimpanya? Atau mungkin menjalankan docker-compose command untuk menginstal tetapi juga menjalankan CMD di file docker utama. Saya tidak memiliki opsi untuk menjalankan pip install di skrip startup, ini akan menambah banyak overhead
 – 
MarkK
4 Januari 2022, 18:28
Saya bukan pengembang python dan karenanya tidak terbiasa dengan pip. Harus melewati yang satu ini. Dari kelihatannya --target adalah apa yang Anda cari. Lihat pertanyaan ini untuk detailnya. Tetapi saya tidak tahu apakah aplikasi Anda akan secara otomatis mengambil dependensi dari direktori yang dikonfigurasi saat startup.
 – 
Turing85
4 Januari 2022, 18:28
Saya kira pertanyaan yang lebih baik untuk opsi ke-3 adalah, dapatkah saya menjalankan docker-compose command dan masih menjalankan dockerfile CMD dan saya pikir Anda tidak dapat memiliki dua
 – 
MarkK
4 Januari 2022, 18:31
Bagaimanapun, Anda telah menjawab pertanyaan awal saya jadi saya akan menerimanya. Terima kasih untuk bantuannya
 – 
MarkK
4 Januari 2022, 18:32
1
Anda dapat mengubah WORKDIR ke folder lain dan kemudian mengimpor persyaratan ke aplikasi Anda dari lokasi itu
 – 
Aleksey Vaganov
4 Januari 2022, 18:34

Saat docker-compose memasang volume ke folder / app, struktur sebelumnya menjadi tersembunyi dan struktur baru menimpa yang sebelumnya.

0
Aleksey Vaganov 4 Januari 2022, 18:24