Docker-compose: создание одного контейнера для разных проектов
Я столкнулся с проблемой, связанной с моими проектами Django, которые имеют схожую структуру. В каждом проекте есть папка backend, содержащая docker-compose.yml
и Dockerfile
.
Структура выглядит следующим образом:
project1/backend/docker-compose.yml project2.backend/docker-compose.yml
Проблема возникает, когда я переключаюсь между проектами и запускаю docker-compose up
. Кажется, что контейнер с именем backend
повторно использует службы из предыдущего проекта вместо того, чтобы создать новый контейнер.
Вот пример docker-compose.yml
для каждого проекта:
Проект 1:
version: '3.9'
services:
redis:
image: redis:latest
ports:
- "6379:6379"
postgres:
image: postgres:12
container_name: postgres
environment:
POSTGRES_PASSWORD: project_name
POSTGRES_DB: project_name
env_file:
- .env
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data/
celery:
build:
context: .
dockerfile: Dockerfile
command: celery -A project_name worker -l info
volumes:
- .:/opt/webapp
depends_on:
- redis
- postgres
celery-beat:
build:
context: .
dockerfile: Dockerfile
command: celery -A project_name beat -l info
volumes:
- .:/opt/webapp
depends_on:
- redis
- postgres
volumes:
postgres_data:
Проект 2:
version: "3.9"
services:
web:
build:
context: .
args:
SECRET_KEY: ${SECRET_KEY}
env_file: .env
volumes:
- ./:/opt/webapp
ports:
- "8000:8000"
# Added Command for hot reloading in dev server
command: >
sh -c "python3 manage.py runserver 0.0.0.0:8000"
postgres:
env_file: .env
environment:
POSTGRES_PASSWORD: project_name
volumes:
- postgres-data:/var/lib/postgresql/data
ports:
- "5432:5432"
redis:
env_file: .env
ports:
- "6379:6379"
volumes:
postgres-data:
Вот пример Dockerfile
для каждого проекта
Project1:
# Use Python 3.11 slim image
FROM python:3.11-slim as base
# Install system dependencies
RUN apt-get update \
&& apt-get install -y --no-install-recommends python3-dev libpq-dev gcc \
&& rm -rf /var/lib/apt/lists/*
# Create and set working directory
WORKDIR /opt/webapp
# Install Pipenv
RUN pip3 install --no-cache-dir -q 'pipenv==2023.12.0'
# Copy Pipfile and Pipfile.lock
COPY Pipfile Pipfile.lock /opt/webapp/
# Install project dependencies
RUN pipenv install --deploy --system
# Copy the rest of the application
COPY . /opt/webapp
# Separate stage for release
FROM base as release
# Copy built files from the base stage
COPY --from=base /opt/webapp /opt/webapp
# Set environment variables and collect static files
ENV PATH=/root/.local/bin:$PATH
ARG SECRET_KEY
RUN python3 manage.py collectstatic --settings=project_name.settings.development
# Default command to run the server
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
Project2:
FROM python:3.8-slim as base
# libpq-dev and python3-dev help with psycopg2
RUN apt-get update \
&& apt-get install -y --no-install-recommends python3-dev libpq-dev gcc curl \
&& apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
&& rm -rf /var/lib/apt/lists/*
WORKDIR /opt/webapp
COPY Pipfile* /opt/webapp/
RUN pip3 install --no-cache-dir -q 'pipenv==2018.11.26'
RUN pipenv install --deploy --system
COPY . /opt/webapp
FROM base as release
COPY --from=base /root/.local /root/.local
COPY --from=base /opt/webapp/manage.py /opt/webapp/manage.py
WORKDIR /opt/webapp
ENV PATH=/root/.local/bin:$PATH
ARG SECRET_KEY
RUN python3 manage.py collectstatic --no-input
# Run the image as a non-root user
RUN adduser --disabled-password --gecos "" django
USER django
CMD waitress-serve --port=$PORT project_name.wsgi:application
Я хочу, чтобы каждый проект создавал свой отдельный контейнер, а не использовал существующий контейнер бэкенда. Как этого добиться, сохранив текущую структуру проекта? Любые соображения или предложения будут очень признательны. Спасибо!
Я дал имена контейнеров для каждой службы, но это мне не помогло, мне нужна идея, как разграничить эти два проекта и создать разные контейнеры для каждого проекта.
Попробуйте переименовать имена сервисов/контейнеров в файле docker-compose.yml, например "project1_postgres:...", "project1_redis:...".
Я думаю, что вы также можете "docker-compose down -v" для удаления анонимных томов, но я думаю, что время запуска будет больше.
Если это не работает, вы также можете попробовать добавить сеть в ваш конкретный проект, так что службы будут разговаривать друг с другом, только если они находятся в той же сети
networks:
custom_network:
driver: bridge
services:
redis:
image: redis:latest
ports:
- "6379:6379"
networks:
- custom_network