Docker Compose找不到pip安装包
Docker Compose cannot find pip installed package
Docker Compose 给出 ModuleNotFoundError: No module named 'django'
错误。 Docker Compose 没有安装我的 pip 安装包 pip install -r requirements.txt
但 运行 以任何其他方式显示它们已安装并且此问题仅与 docker-compose 相关,为什么?
撰写
version: '3.8'
services:
web:
build: ./
user: python
volumes:
- ./:/app
ports:
- 8000:8000
env_file:
- ./.env.dev
Docker文件
# 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
问题:
我创建了以下 Docker 文件,该文件 运行 正在生产中,甚至 运行 在 docker 之外本地创建 - 没有任何问题,即以下作品没有错误 docker run -p 8000:8000 web/lastest
.
然而,当我 运行 通过 docker-compose 时,它找不到我安装的 pip 包。
例如:
- docker-compose构建(成功)
- docker-组合
错误
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'
运行 which python
直接在 运行 图像和使用 docker-compose 上输出 /usr/local/bin/python
。
运行 docker run -it 43d991d65c02 /bin/bash
我可以看到 运行 Django。只有运行ning docker-compose 时Django 没有安装,为什么?
在提供的容器文件中,我们在容器目录 /app
中工作。但是在 运行 时,我们将一个卷装载到 /app
。因此,存储在 /app
中的映像构建期间生成的所有内容都被卷装载覆盖。如果 运行 时的依赖项是在 /app
中安装的,那么它们将被卷安装覆盖。
为了解决这个问题,我想到了两种可能性:
我们可以删除卷安装。然而,这将使我们失去“热重载”的能力。
我们可以在容器启动时重新运行pip install -r requirements.txt
,然后再启动应用程序。这意味着将 pip install -r requirements.txt
行添加到 entrypoint.sh
-脚本。
当 docker-compose 将卷装载到 /app 文件夹时,它以前的结构会隐藏,新结构会覆盖以前的结构。
Docker Compose 给出 ModuleNotFoundError: No module named 'django'
错误。 Docker Compose 没有安装我的 pip 安装包 pip install -r requirements.txt
但 运行 以任何其他方式显示它们已安装并且此问题仅与 docker-compose 相关,为什么?
撰写
version: '3.8'
services:
web:
build: ./
user: python
volumes:
- ./:/app
ports:
- 8000:8000
env_file:
- ./.env.dev
Docker文件
# 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
问题:
我创建了以下 Docker 文件,该文件 运行 正在生产中,甚至 运行 在 docker 之外本地创建 - 没有任何问题,即以下作品没有错误 docker run -p 8000:8000 web/lastest
.
然而,当我 运行 通过 docker-compose 时,它找不到我安装的 pip 包。
例如:
- docker-compose构建(成功)
- docker-组合
错误
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'
运行 which python
直接在 运行 图像和使用 docker-compose 上输出 /usr/local/bin/python
。
运行 docker run -it 43d991d65c02 /bin/bash
我可以看到 运行 Django。只有运行ning docker-compose 时Django 没有安装,为什么?
在提供的容器文件中,我们在容器目录 /app
中工作。但是在 运行 时,我们将一个卷装载到 /app
。因此,存储在 /app
中的映像构建期间生成的所有内容都被卷装载覆盖。如果 运行 时的依赖项是在 /app
中安装的,那么它们将被卷安装覆盖。
为了解决这个问题,我想到了两种可能性:
我们可以删除卷安装。然而,这将使我们失去“热重载”的能力。
我们可以在容器启动时重新运行
pip install -r requirements.txt
,然后再启动应用程序。这意味着将pip install -r requirements.txt
行添加到entrypoint.sh
-脚本。
当 docker-compose 将卷装载到 /app 文件夹时,它以前的结构会隐藏,新结构会覆盖以前的结构。