如何将django-tailwind集成到Docker化的cookiecutter-django项目中?
问题描述
我是Docker新手,正尝试将django-tailwind集成到使用cookiecutter-django创建的Docker项目中却遭遇困难。我曾参照django-tailwind GitHub仓库示例应用的Docker配置修改自身的Dockerfile和local.yml文件,但未能成功,且官方文档除示例外的说明不够详细。以下是我的Dockerfile和local.yml配置:
Dockerfile
ARG PYTHON_VERSION=3.9-slim-bullseye # define an alias for the specfic python version used in this file. FROM python:${PYTHON_VERSION} as python # Python build stage FROM python as python-build-stage ARG BUILD_ENVIRONMENT=local # Install apt packages RUN apt-get update && apt-get install --no-install-recommends -y \ # dependencies for building Python packages build-essential \ # psycopg2 dependencies libpq-dev # Requirements are installed here to ensure they will be cached. COPY ./requirements . # Create Python Dependency and Sub-Dependency Wheels. RUN pip wheel --wheel-dir /usr/src/app/wheels \ -r ${BUILD_ENVIRONMENT}.txt # Python 'run' stage FROM python as python-run-stage ARG BUILD_ENVIRONMENT=local ARG APP_HOME=/app ENV PYTHONUNBUFFERED 1 ENV PYTHONDONTWRITEBYTECODE 1 ENV BUILD_ENV ${BUILD_ENVIRONMENT} WORKDIR ${APP_HOME} # Install required system dependencies RUN apt-get update && apt-get install --no-install-recommends -y \ # psycopg2 dependencies libpq-dev \ # Translations dependencies gettext \ # cleaning up unused files && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \ && rm -rf /var/lib/apt/lists/* # All absolute dir copies ignore workdir instruction. All relative dir copies are wrt to the workdir instruction # copy python dependency wheels from python-build-stage COPY --from=python-build-stage /usr/src/app/wheels /wheels/ # use wheels to install python dependencies RUN pip install --no-cache-dir --no-index --find-links=/wheels/ /wheels/* \ && rm -rf /wheels/ COPY ./compose/production/django/entrypoint /entrypoint RUN sed -i 's/\r$//g' /entrypoint RUN chmod +x /entrypoint COPY ./compose/local/django/start /start RUN sed -i 's/\r$//g' /start RUN chmod +x /start COPY ./compose/local/django/celery/worker/start /start-celeryworker RUN sed -i 's/\r$//g' /start-celeryworker RUN chmod +x /start-celeryworker COPY ./compose/local/django/celery/beat/start /start-celerybeat RUN sed -i 's/\r$//g' /start-celerybeat RUN chmod +x /start-celerybeat COPY ./compose/local/django/celery/flower/start /start-flower RUN sed -i 's/\r$//g' /start-flower RUN chmod +x /start-flower # copy application code to WORKDIR COPY . ${APP_HOME} ENTRYPOINT ["/entrypoint"]
local.yml
version: '3' volumes: uniqued_local_postgres_data: {} uniqued_local_postgres_data_backups: {} services: django: &django build: context: . dockerfile: ./compose/local/django/Dockerfile image: uniqued_local_django container_name: uniqued_local_django platform: linux/x86_64 depends_on: - postgres - redis volumes: - .:/app:z env_file: - ./.envs/.local/.django - ./.envs/.local/.postgres ports: - "8000:8000" command: /start postgres: build: context: . dockerfile: ./compose/production/postgres/Dockerfile image: uniqued_production_postgres container_name: uniqued_local_postgres volumes: - uniqued_local_postgres_data:/var/lib/postgresql/data:Z - uniqued_local_postgres_data_backups:/backups:z env_file: - ./.envs/.local/.postgres docs: image: uniqued_local_docs container_name: uniqued_local_docs platform: linux/x86_64 build: context: . dockerfile: ./compose/local/docs/Dockerfile env_file: - ./.envs/.local/.django volumes: - ./docs:/docs:z - ./config:/app/config:z - ./uniqued:/app/uniqued:z ports: - "9000:9000" command: /start-docs redis: image: redis:6 container_name: uniqued_local_redis celeryworker: <<: *django image: uniqued_local_celeryworker container_name: uniqued_local_celeryworker depends_on: - redis - postgres ports: [] command: /start-celeryworker celerybeat: <<: *django image: uniqued_local_celerybeat container_name: uniqued_local_celerybeat depends_on: - redis - postgres ports: [] command: /start-celerybeat flower: <<: *django image: uniqued_local_flower container_name: uniqued_local_flower ports: - "5555:5555" command: /start-flower
修改方案
1. 更新Dockerfile(添加Node.js依赖)
django-tailwind需要Node.js和npm编译CSS,在Python运行阶段添加安装命令:
# Python 'run' stage FROM python as python-run-stage ARG BUILD_ENVIRONMENT=local ARG APP_HOME=/app ENV PYTHONUNBUFFERED 1 ENV PYTHONDONTWRITEBYTECODE 1 ENV BUILD_ENV ${BUILD_ENVIRONMENT} WORKDIR ${APP_HOME} # Install required system dependencies RUN apt-get update && apt-get install --no-install-recommends -y \ # psycopg2 dependencies libpq-dev \ # Translations dependencies gettext \ # 安装Node.js和npm用于django-tailwind curl \ && curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \ && apt-get install -y nodejs \ # cleaning up unused files && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \ && rm -rf /var/lib/apt/lists/* # 其余代码保持不变
2. 修改local.yml(启动tailwind编译服务)
修改django服务的command,让容器启动时自动安装npm依赖、启动tailwind实时编译,同时运行Django开发服务器:
services: django: &django build: context: . dockerfile: ./compose/local/django/Dockerfile image: uniqued_local_django container_name: uniqued_local_django platform: linux/x86_64 depends_on: - postgres - redis volumes: - .:/app:z env_file: - ./.envs/.local/.django - ./.envs/.local/.postgres ports: - "8000:8000" # 替换原有command为以下内容,替换your_tailwind_app为实际应用名 command: > sh -c " # 首次运行初始化tailwind应用,已初始化可删除该行 python manage.py tailwind init your_tailwind_app --skip-install && cd your_tailwind_app/static_src && npm install && # 后台启动tailwind实时编译 python manage.py tailwind start & # 启动Django开发服务器 /start " # 其余服务配置保持不变
注意:将your_tailwind_app替换为你实际创建的tailwind应用名称(比如theme)
3. Django项目内部配置
确保项目已完成django-tailwind基础配置:
- 在
INSTALLED_APPS中添加tailwind和你的tailwind应用(如theme) - 在
settings.py中设置TAILWIND_APP_NAME = 'theme' - 在项目根
urls.py中添加路由:path('tailwind/', include('tailwind.urls'))
内容的提问来源于stack exchange,提问作者beginnercoder
相关产品推荐
相关产品推荐

