从
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
您的撰写文件有
volumes:
- ./ecommerce:/app
这会使用主机系统上存在的任何内容覆盖映像中的
/app
目录。
也就是说:在镜像代码上挂载本地内容会重新引入 Docker 通常试图避免的“在我的机器上运行”问题。 如果您碰巧在本地签出了源代码,这将起作用,但现在如果您要部署它,则永远不会运行映像中内置的内容。
如果删除此卷挂载,那么您将运行映像中实际内置的内容。 一般来说,这是一个更具可重复性的设置。 您可以使用基于主机的工具(您的 MacOS 或 Linux 主机甚至预装了 Python)进行日常开发,并使用完整的容器设置进行集成测试和部署。