Docker compose не устанавливает django или не находит Django после установки
Docker-Compose.yml
version: '3.9'
services:
nginx:
restart: unless-stopped
build:
context: .
dockerfile: ./docker/nginx/Dockerfile
ports:
- 80:80
- 443:443
volumes:
- dev-static_volume:/vol/static
- dev-media_volume:/vol/media
- ./docker/nginx:/etc/nginx/conf.d
depends_on:
- app
command: "/bin/sh -c 'while :; do sleep 6h & wait $${!}; nginx -s reload; done & nginx -g \"daemon off;\"'"
app:
restart: unless-stopped
build:
context: .
dockerfile: ./docker/server/Dockerfile
entrypoint: /app/docker/server/entrypoint.sh
volumes:
- dev-static_volume:/vol/static
- dev-media_volume:/vol/media
expose:
- 8000
environment:
- DB_HOST=db
- DB_NAME=devdb
- DB_USER=devuser
- DB_PASS=changeme
- DEBUG=1
depends_on:
- db
db:
image: postgres:13-alpine
volumes:
- dev-db-data:/var/lib/postgresql/data
environment:
- POSTGRES_DB=devdb
- POSTGRES_USER=devuser
- POSTGRES_PASSWORD=changeme
volumes:
dev-static_volume:
dev-media_volume:
dev-db-data:
Dockerfile:
FROM python:3.10-alpine
MAINTAINER = 'Me'
ENV PYTHONUNBUFFERED 1
COPY ./fp-backend/requirements.txt /tmp/requirements.txt
COPY ./fp-backend/requirements.dev.txt /tmp/requirements.dev.txt
COPY ./fp-backend/app /app
COPY ./docker /app/docker
WORKDIR /app
EXPOSE 8000
ARG DEV=false
RUN python -m venv /py && \
/py/bin/pip install --upgrade pip && \
apk add --update --no-cache nodejs npm && \
apk add --update --no-cache postgresql-client jpeg-dev && \
apk add --update --no-cache --virtual .tmp-build-deps \
build-base postgresql-dev musl-dev zlib zlib-dev linux-headers && \
/py/bin/pip install -r /tmp/requirements.txt && \
/py/bin/pip install Django && \
if [ $DEV = "true" ]; \
then /py/bin/pip install -r /tmp/requirements.dev.txt ; \
fi && \
rm -rf /tmp && \
apk del .tmp-build-deps && \
adduser \
--disabled-password \
--no-create-home \
django-user && \
mkdir -p /vol/web/media && \
mkdir -p /vol/web/static && \
chown -R django-user:django-user /app && \
chmod -R 755 /app && \
chmod -R +x /app/docker/server/entrypoint.sh
USER django-user
CMD ["entrypoint.sh"]
Сценарий 'entrypoint.sh':
#!/bin/sh
set -e
until cd /app
do
echo "Waiting for server volume..."
done
until python manage.py migrate
do
echo "Waiting for db to be ready..."
sleep 2
done
python manage.py collectstatic --noinput
python manage.py createsuperuser --noinput
gunicorn app.wsgi --bind 0.0.0.0:8000 --workers 4 --threads 4
Ошибка Traceback:
Traceback (most recent call last):
app_1 | File "/app/manage.py", line 11, in main
app_1 | from django.core.management import execute_from_command_line
app_1 | ModuleNotFoundError: No module named 'django'
app_1 |
app_1 | The above exception was the direct cause of the following exception:
app_1 |
app_1 | Traceback (most recent call last):
app_1 | File "/app/manage.py", line 22, in <module>
app_1 | main()
app_1 | File "/app/manage.py", line 13, in main
app_1 | raise ImportError(
app_1 | ImportError: Couldn't import Django. Are you sure it's installed and available on your PYTHONPATH environment variable? Did you forget to act
ivate a virtual environment?
Я понятия не имею, почему это не удается собрать, и это начало происходить только после того, как я добавил NGINX, а именно:
server {
listen 80;
server_name _;
server_tokens off;
client_max_body_size 20M;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
location /api {
try_files $uri @proxy_api;
}
location /admin {
try_files $uri @proxy_api;
}
location @proxy_api {
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://server:8000;
}
location /vol/static {
autoindex on;
alias /vol/static;
}
location /vol/media/ {
autoindex on;
alias /vol/media/;
}
}
Я понятия не имею, почему это может быть неудачным. Почему сервер не может найти установку django? Я имею в виду, что код достаточно самоочевиден, но я добавляю немного lorem ipsum, потому что, очевидно, я не могу опубликовать это как основной код.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum
В Dockerfile
, python -m venv /py
создает виртуальную среду в каталоге /py
, а последующие вызовы /py/bin/pip install ...
устанавливают пакеты в эту виртуальную среду. Это означает, что Django
устанавливается в виртуальную среду.
Ошибка ImportError: Couldn't import Django
происходит потому, что entrypoint.sh
не использует виртуальное окружение. Добавление source /py/bin/activate
в начало файла должно исправить это:
#!/bin/sh
set -e
source /py/bin/activate
until cd /app
do
echo "Waiting for server volume..."
done
until python manage.py migrate
do
echo "Waiting for db to be ready..."
sleep 2
done
python manage.py collectstatic --noinput
python manage.py createsuperuser --noinput
gunicorn app.wsgi --bind 0.0.0.0:8000 --workers 4 --threads 4