【问题标题】:How to Build a ubuntu docker container with postgres installed in?如何构建安装了 postgres 的 ubuntu docker 容器?
【发布时间】:2020-03-18 10:24:10
【问题描述】:

这是挑战,我已经用 pyqt5 和其他一些库(包括 postgresql)在 python 中编写了一个程序,现在的问题是,如何构建一个安装了 postgresql 的 docker ubuntu 容器?而且我必须将 postgres 用户设置为 postgres,密码设置为 1234,以使一切正常。

我迷失在如何写好 Dockerfile 并尊重所有要求。

提前感谢您的解决方案,如果有什么不清楚的地方可以问我一个问题,我会在几分钟内澄清。

【问题讨论】:

  • 您可以在另一个容器中生成 postgres 并将其用作数据库。通过 docker compose 协调一切。或者有什么理由不这样做?
  • 不,我期待 Dockerfile 作为响应,但是您的建议可以用作替代解决方案,但我有点复杂,如果您可以提供 Dockerfile 作为示例,我将不胜感激。
  • 容器应该保持小而集中。您应该使用多个小容器而不是一个大容器。
  • 好的,但是我需要 Dockerfile 示例来链接我所期望的所有内容。
  • Docker 文档有一个官方的Django and PostgreSQL sample 非常接近您的需要。

标签: python postgresql docker


【解决方案1】:

我已经整理了一个示例配置。

docker-compose.yml

version: '3'

volumes:
  local_postgres_data: {}
  local_postgres_data_backups: {}

services:
  web:
    build: 
      context: .
      dockerfile: ./compose/python/Dockerfile
    ports: 
      - "8000:8000"
    depends_on:
      - postgres
    env_file:
      - ./.envs/.postgres
    command: /start


  postgres:
    build:
      context: .
      dockerfile: ./compose/postgres/Dockerfile
    image: app_production_postgres
    volumes:
      - local_postgres_data:/var/lib/postgresql/data
      - local_postgres_data_backups:/backups
    env_file:
      - ./.envs/.postgres
    ports:
      - "5432:5432"

撰写/postgres/Dockerfile

FROM postgres:11.3

撰写/python/Dockerfile

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt

COPY ./compose/python/start /start
RUN sed -i 's/\r$//g' /start
RUN chmod +x /start

COPY ./compose/python/entrypoint /entrypoint
RUN sed -i 's/\r$//g' /entrypoint
RUN chmod +x /entrypoint

ENTRYPOINT ["/entrypoint"]

撰写/python/入口点

#!/bin/sh

set -o errexit
set -o nounset


if [ -z "${POSTGRES_USER}" ]; then
    base_postgres_image_default_user='postgres'
    export POSTGRES_USER="${base_postgres_image_default_user}"
fi
export DATABASE_URL="postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DB}"

postgres_ready() {
python << END
import sys

import psycopg2

try:
    psycopg2.connect(
        dbname="${POSTGRES_DB}",
        user="${POSTGRES_USER}",
        password="${POSTGRES_PASSWORD}",
        host="${POSTGRES_HOST}",
        port="${POSTGRES_PORT}",
    )
except psycopg2.OperationalError:
    sys.exit(-1)
sys.exit(0)

END
}
until postgres_ready; do
  >&2 echo 'Waiting for PostgreSQL to become available...'
  sleep 1
done
>&2 echo 'PostgreSQL is available'

exec "$@"

撰写/python/开始

#!/bin/sh

set -o errexit
set -o nounset


python -m http.server

requirements.txt

psycopg2>=2.7,<3.0

.envs/.postgres

# PostgreSQL
POSTGRES_HOST=postgres
POSTGRES_PORT=5432
POSTGRES_DB=your_app
POSTGRES_USER=debug
POSTGRES_PASSWORD=debug

此配置是django cookiecutter生成的docker项目的精简版

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    相关资源
    最近更新 更多