Запрос из приложения в Docker
Запрос из приложения
читает строку из таблицы
и отдаёт её на странице.
Модуль psycopg
идёт на хост db,
базу db
и таблицу notes
под пользователем app.
Слово hello
попадает в ответ HTTP
на порту 8000
с публикацией 8080
без стороннего фреймворка.
Скрипт читает адрес
из окружения,
открывает соединение,
читает поле из строки
и слушает 0.0.0.0:
import os
import psycopg
from http.server import BaseHTTPRequestHandler, HTTPServer
def load_word():
conninfo = (
f"host={os.environ['DB_HOST']} "
f"port={os.environ['DB_PORT']} "
f"dbname={os.environ['DB_NAME']} "
f"user={os.environ['DB_USER']} "
f"password={os.environ['DB_PASSWORD']}"
)
with psycopg.connect(conninfo) as conn:
with conn.cursor() as cur:
cur.execute("SELECT body FROM notes LIMIT 1")
row = cur.fetchone()
return row[0]
WORD = load_word()
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.end_headers()
self.wfile.write(WORD.encode())
if __name__ == '__main__':
HTTPServer(('0.0.0.0', 8000), Handler).serve_forever()
Зависимость и образ
собираются как в уроке
про драйвер.
Файл requirements.txt
содержит psycopg[binary],
а Dockerfile
выполняет pip install
с флагом -r
при сборке.
psycopg[binary]
Шаги образа такие:
FROM python:3.14
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY app.py .
CMD ["python", "app.py"]
Сервис db
с базой db
и пользователем app.
Сервис app
собирается из точки,
получает части адреса,
стартует после db
по порядку запуска
и публикует порт
8080:
services:
db:
image: postgres:18
environment:
POSTGRES_PASSWORD: demo
POSTGRES_DB: db
POSTGRES_USER: app
app:
build: .
ports:
- "8080:8000"
environment:
DB_HOST: db
DB_PORT: "5432"
DB_NAME: db
DB_USER: app
DB_PASSWORD: demo
depends_on:
- db
Таблицу notes
со словом hello
создают отдельной командой
после подъёма:
docker compose up -d --build
Заполнение таблицы внутри сервиса базы:
docker compose exec db psql -U app -d db -c "CREATE TABLE IF NOT EXISTS notes (id SERIAL PRIMARY KEY, body TEXT); INSERT INTO notes (body) VALUES ('hello');"
Если сервер ещё не готов,
страницу обновляют,
пока ответ не появится.
Откроем адрес localhost:8080
в браузере и увидим
слово hello.
Опишите сервис store с пользователем app и сервис note с образом приложения, портом 8080 и зависимостью от store по порядку старта.
Откройте localhost:8080 и зафиксируйте текст ответа после чтения из таблицы marks.