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?
2 jawaban
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:
Kami dapat menghapus mount volume. Ini akan, bagaimanapun, tanpa kita dari kemampuan "reload panas".
Kita dapat menjalankan kembali
pip install -r requirements.txt
pada startup container, sebelum memulai aplikasi. Ini berarti menambahkan barispip install -r requirements.txt
ke skripentrypoint.sh
.
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
--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.
command
dan masih menjalankan dockerfile CMD dan saya pikir Anda tidak dapat memiliki dua
Saat docker-compose memasang volume ke folder / app, struktur sebelumnya menjadi tersembunyi dan struktur baru menimpa yang sebelumnya.
/app
dalam wadah dengan volume mount saat runtime.Django
di requirements.txt?pip install -r requirements.txt
pada container-startup memperbaiki masalah?