Каталог зависимостей в Docker
Каталог .venv закрывают
отдельным томом,
иначе папка с хоста
затирает пакеты из образа.
Том $PWD/app:/app
подменяет весь /app,
включая .venv
из слоя сборки.
Шаблон создаёт окружение
и ставит пакеты
на этапе образа.
Файл app/Dockerfile:
FROM python:3.14
WORKDIR /app
COPY requirements.txt .
RUN python -m venv .venv \
&& .venv/bin/pip install -r requirements.txt
COPY app.py .
ENV PATH="/app/.venv/bin:$PATH"
CMD ["python", "app.py"]
Скрипт app/app.py
слушает 0.0.0.0
на 8000
и отдаёт hello:
from http.server import BaseHTTPRequestHandler, HTTPServer
class Handler(BaseHTTPRequestHandler):
def do_GET(self):
self.send_response(200)
self.end_headers()
self.wfile.write(b'hello')
if __name__ == '__main__':
HTTPServer(('0.0.0.0', 8000), Handler).serve_forever()
В app/requirements.txt
список пакетов
пуст -
установка всё равно
создаёт каталог
в образе:
Второй том без имени слева
держит /app/.venv
отдельно от папки проекта.
Без этой строки
пустой .venv
с хоста скрывает каталог
из образа.
Файл compose.yaml:
services:
app:
build: ./app
ports:
- "8080:8000"
volumes:
- "$PWD/app:/app"
- /app/.venv
Подъём с пересборкой поднимет сервис с кодом с диска и пакетами из образа. Выполним запуск проекта:
docker compose up -d --build
Соберите сервис note с установкой pip в образе и двумя томами, чтобы каталог .venv не затирался с хоста.
Откройте localhost:8080 и проверьте ответ hello.