Как создать один Dockerfile для нескольких контейнеров без использования docker-compose.yml?

Здесь у меня 2 случая:

Случай 1. Я создал проект Django под названием Counterprojкоторый использует db по умолчанию с именем. Я закрепил этот проект, используя и отправил его в Azure ACI, который хорошо работал в обоих случаях. local а также cloud.

Случай 2. Проблема начинается здесь, когда я перешел с Sqlite3 к PostgreSQL У меня есть dockerized проект Django, используя и с услугами web а также db они работают нормально на моем локальном компьютере, но когда я нажимаю на Azure ACI, контейнеры Counterproj_web:test а также postgres:test не могут взаимодействовать друг с другом, и экземпляр завершается.

Здесь мой запрос заключается в том, можем ли мы создать один Dockerfile без использования docker-compose.yml для контейнеризации проекта Django с использованием PostgreSQL в качестве db. Если мы можем создать один файл докеров, пожалуйста, предложите мне лучший способ, который должен работать как локально, так и в облаке.

Ниже мои Dockerfile, docker-compose.yml а также database settings для справки.

Dockerfile:

      #syntax=docker/dockerfile:experimental

# Python Version(Base Image)
FROM python:3

# Set Envirment variable 
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

# Set Working directory
WORKDIR /app

# Add all the things into app
ADD . /app

# Instruct docker to install all the requirements to run the project
# Copy current requirements to your docker image
COPY ./requirments.txt /app/requirments.txt

RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirments.txt

COPY . /app

# install dependencies
RUN pip install --upgrade pip

docker-compose.yml:

      version: '3.3'
services:
  db:
    image: postgres:test
    volumes:
      - ./db/:/var/lib/posgresql/data    
    environment:
      - POSTGRES_DB=Counterproj
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=12345
         
  web:
    image: Counterproj_web:test
    build: .
    command: python manage.py runserver 0.0.0.0:80
    ports:
      - "80:80"
    volumes:
      - .:/app    
    depends_on:
      - db

settings.py:

      DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'Counterproj',
        'USER': 'postgres',
        'PASSWORD': '12345',
        'HOST': 'db',
        'PORT': 5432,
    }
}

2 ответа

Один контейнер - одна цель. Размещение вашей БД и приложения нарушает эту передовую практику. Всегда имейте два контейнера - один для БД и один для вашего приложения. Использование файла docker-compose будет достаточно, чтобы ваши контейнеры могли взаимодействовать.

Возможная проблема, которую я вижу, заключается в том, что вы монтируете некоторые локальные каталоги - вы уверены, что файлы на вашем удаленном компьютере находятся именно там?

Вы всегда должны использовать файл Docker-Compose. Вам будет проще поддерживать все параметры, необходимые для запуска контейнеров Docker.

В противном случае вам придется передавать параметры непосредственно во время запуска контейнеров.

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