当构建容器时,docker-compose
Dockerfile 没有错误,并且有效地复制了文件,但是在构建映像之后,docker-compose 使用command: ls -la /app
并且文件不存在。
设置如下:
docker-compose.yml
version: '3.8'
services:
web:
build:
context: .
dockerfile: Dockerfile
command: ls -la /app
volumes:
- ./ecommerce:/app
ports:
- "8000:8000"
depends_on:
- redis
- rabbitmq
environment:
- DEBUG=${DEBUG}
- DJANGO_SECRET_KEY=${DJANGO_SECRET_KEY}
- DJANGO_ALLOWED_HOSTS=${DJANGO_ALLOWED_HOSTS}
- DEVELOPMENT_MODE=${DEVELOPMENT_MODE}
- STRIPE_PUBLISHABLE_KEY=${STRIPE_PUBLISHABLE_KEY}
- STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY}
- STRIPE_WEBHOOK_SECRET=${STRIPE_WEBHOOK_SECRET}
- REDIS_HOST=redis
- CELERY_BROKER_URL=amqp://guest:guest@rabbitmq:5672//
redis:
image: redis:alpine
rabbitmq:
image: rabbitmq:3-management
ports:
- "5672:5672"
- "15672:15672"
environment:
RABBITMQ_DEFAULT_USER: guest
RABBITMQ_DEFAULT_PASS: guest
Dockerfile
# Use the official Python image from the Docker Hub
FROM python:3.9-slim
# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# Set the working directory
WORKDIR /app
# Install system dependencies
RUN apt-get update && apt-get install -y \
build-essential \
libpq-dev \
libpango1.0-0 \
libcairo2 \
libgdk-pixbuf2.0-0 \
libffi-dev \
shared-mime-info \
&& rm -rf /var/lib/apt/lists/*
# Install Python dependencies
COPY requirements.txt /app
RUN pip install --upgrade pip
RUN pip install -r requirements.txt
# Copy the entrypoint script into the container
COPY ./entry/entrypoint.sh /app <--- this runs OK but it not listed in the container
RUN chmod +x /app/entrypoint.sh
# Copy the Django project code into the container
COPY ./ecommerce /app
# Collect static files
RUN python manage.py collectstatic --noinput
您的 Compose 文件具有
您应该删除这个块。
此设置会
/app
用主机系统上存在的任何内容覆盖映像中的目录。具体来说,entrypoint.sh
脚本不在ecommerce
主机系统的目录中,因此绑定挂载会将其隐藏在映像中。也就是说:在镜像代码上安装本地内容会重新引入 Docker 通常试图避免的“在我的计算机上工作”问题。如果您碰巧在本地签出了源代码,那么这将会起作用,但现在如果您去部署它,您将永远不会运行镜像中内置的内容。
如果您删除此卷挂载,那么您将运行映像中实际内置的内容。一般来说,这是一个更可重现的设置。您可以使用基于主机的工具进行日常开发(您的 MacOS 或 Linux 主机甚至预装了 Python),并使用完整的容器设置进行集成测试和部署。