Установка пакета в docker

Я использую docker в проекте django, и установил пакеты, которые указаны в req.txt.
. Во время проекта мне нужно установить пакет и я сделал это с помощью docker-compose exec web pip install 'package' и docker-compose up -d --build, он установился в docker, но я не могу использовать его в моем проекте, который не установлен в проекте.
Вопрос:

  • Как установить пакет в docker?
  • Можно ли записать установленные пакеты в req.txt с помощью docker?

Dockerfile:

FROM python:3.8

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

WORKDIR /code

COPY requirements.txt /code/
RUN pip install -r requirements.txt

COPY . /code/

docker-compose.yml:

version: '3.9'

services:
  web:
    build: .
    command: python /code/manage.py runserver 0.0.0.0:8000

    volumes:
      - .:/code

    ports:
      - 8000:8000
    depends_on:
      - db

  db:
    image: postgres:11
    volumes:
      - postgres_data:/var/lib/postgresql/data/
    environment:
      - "POSTGRES_HOST_AUTH_METHOD=trust"

volumes:
  postgres_data:

Вот стандартный рабочий процесс, который я бы использовал здесь.

Прежде всего, убедитесь, что у вас есть нормальная рабочая не-Docker среда разработки.

python3 -m venv vpy
. vpy/bin/activate
pip install -e .

Затем отредактируйте ваш setup.cfg файл, чтобы включить новый пакет и обновите виртуальную среду.

$EDITOR setup.cfg
# add install_requires= package
pip install -e .

Убедитесь, что ваше приложение работает правильно.

pytest
run_the_app  # calling a setuptools console_scripts= script

Обновление файла блокировки пакета.

pip freeze > requirements.txt

Все это до сих пор находится на вашем хосте, вне Docker. Теперь вы можете пересобрать образ для запуска интеграционных тестов:

docker-compose build
docker-compose up -d
curl http://localhost:8000

Обратите внимание, что эта установка - совершенно обычный рабочий процесс с зависимостями Python, плюс финальная "сборка образа Docker" в конце. В ней нет ничего специфичного для Docker, и вы не "устанавливаете зависимость в Docker" или "обновляете исходный код хоста из развернутого образа". Подобное можно сделать с помощью более новых инструментов, таких как Pipenv, вместо обычных виртуальных сред.

(Вам не нужен блок Compose volumes: для скрытия кода в изображении, также не нужна строка Compose command: для переопределения CMD в Dockerfile)

Вернуться на верх