Как создать один 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.
В противном случае вам придется передавать параметры непосредственно во время запуска контейнеров.