【问题标题】:How to create single Dockerfile for multiple containers without using docker-compose.yml?如何在不使用 docker-compose.yml 的情况下为多个容器创建单个 Dockerfile?
【发布时间】:2021-06-10 16:19:24
【问题描述】:

这里有2个案例:

案例 1: 我创建了一个名为 Counterproj 的 Django 项目,它使用名为 Sqlite3 的默认数据库。我已经使用 Dockerfile 对这个项目进行 docker 化并推送到 Azure ACI,它在 localcloud 两种情况下都运行良好。

案例 2: 当我从 Sqlite3 迁移到 PostgreSQL 时,问题就从这里开始了@ 这些在我的本地运行良好,但是当我推送到 Azure ACI 时,容器 Counterproj_web:testpostgres:test 无法相互通信并且实例正在终止。

我的查询是,我们能否在不使用任何 docker-compose.yml 的情况下创建单个 Dockerfile,以使用 PostgreSQL 作为数据库进行 Django 项目容器化。如果我们可以创建单个 dockerfile,请建议我应该在本地和云中运行的最佳方式。

下面是我的Dockerfiledocker-compose.ymldatabase 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,
    }
}

【问题讨论】:

    标签: django docker docker-compose dockerfile azure-acr


    【解决方案1】:

    您应该始终使用 Docker-Compose 文件。维护运行 Docker 容器所需的所有参数会更容易。

    否则,你必须在容器运行时直接传递参数。

    【讨论】:

    • 你能帮我看看如何编写包含db的单个Dockerfile,或者在运行容器时直接传递参数吗?
    【解决方案2】:

    一个容器 - 一个目的。放置您的数据库和应用程序会破坏这种最佳实践。始终有两个容器 - 一个用于数据库,一个用于您的应用程序。 使用 docker-compose 文件足以让您的容器进行通信。

    我看到的一个可能问题是您正在挂载一些本地目录 - 您确定远程计算机上的文件确实存在吗?

    【讨论】:

    • 你能帮我看看如何编写包含db的单个Dockerfile
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2015-12-30
    • 1970-01-01
    • 2021-10-13
    • 2020-08-02
    • 2020-02-12
    • 2016-08-21
    相关资源
    最近更新 更多