Запуск collectstatic Django в Dockerfile создает пустой каталог

Я пытаюсь запустить Django из контейнера Docker на Heroku, но для этого мне нужно запустить python manage.py collectstatic на этапе сборки. Для этого я написал следующий Dockerfile:

# Set up image
FROM python:3.10
WORKDIR /usr/src/app
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1

# Install poetry and identify Python dependencies
RUN pip install poetry
COPY pyproject.toml /usr/src/app/

# Install Python dependencies
RUN set -x \
    && apt update -y \
    && apt install -y \
        libpq-dev \
        gcc \
    && poetry config virtualenvs.create false \
    && poetry install --no-ansi

# Copy source into image
COPY . /usr/src/app/

# Collect static files
RUN python -m manage collectstatic -v 3 --no-input

А вот файл docker-compose.yml, который я использовал для запуска образа:

services:
    db:
        image: postgres
        env_file:
            - .env.docker.db
        volumes:
            - db:/var/lib/postgresql/data
        networks:
            - backend
        ports:
            - "5433:5432"
    web:
        build: .
        restart: always
        env_file:
            - .env.docker.web
        ports:
            - "8001:$PORT"
        volumes:
            - .:/usr/src/app
        depends_on:
            - db
        networks:
            - backend
        command: gunicorn --bind 0.0.0.0:$PORT myapp.wsgi
volumes:
    db:
networks:
    backend:
        driver: bridge

Dockerfile строится просто отлично, и я даже вижу, что collectstatic работает и собирает соответствующие файлы во время сборки. Однако, когда сборка завершена, единственным доказательством запуска collectstatic является пустой каталог с именем staticfiles. Если я снова запускаю collectstatic внутри своего контейнера, collectstatic работает нормально, но поскольку Heroku не сохраняет файлы, созданные после этапа сборки, они исчезают при перезапуске моего приложения.

Я нашел несколько ответов SO, в которых обсуждалось, как заставить collectstatic работать внутри Dockerfile, но это не моя проблема; моя проблема в том, что он запускается, но собранные файлы не отображаются в контейнере. Кто-нибудь знает, что происходит?

Обновлено:Этот ответ сделал свое дело. Мой docker-compose.yml переопределял изменения, сделанные collectstatic, с помощью этой строки:

        volumes:
            - .:/usr/src/app

Если, как и я, вы хотите сохранить монтирование привязки для простоты локальной разработки (чтобы вам не нужно было каждый раз пересобирать), вы можете отредактировать команду для веб-сервиса следующим образом:

        command: bash -c "python -m manage collectstatic && gunicorn --bind 0.0.0.0:$PORT myapp.wsgi"

Обратите внимание, что образ работал бы нормально, если бы я отправил его в Heroku (поскольку Heroku не использует файл docker-compose.yml), так что это была просто проблема, затрагивающая контейнеры, которые я создал на своем локальном компьютере.

Как вы запускаете свой контейнер при его запуске?

Sergio Santiago 23.04.2022 08:42

Я запустил его из файла docker-compose.yml. Я добавлю содержание к своему первоначальному вопросу.

coreye 23.04.2022 16:54
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
2
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы переопределяете содержимое /usr/src/app в своем контейнере, когда добавляете

volumes:
        - .:/usr/src/app

В ваш докер скомпилируйте файл.

Удалите, так как вы уже скопировали все во время сборки.

Блестяще, получилось! Спасибо, что заметили мою ошибку новичка.

coreye 23.04.2022 20:00

Если это поможет, рассмотрите возможность сделать это как ответили

Sergio Santiago 24.04.2022 21:27

Другие вопросы по теме