Могу ли я использовать setuptools только для установки зависимостей? - PullRequest
2 голосов
/ 21 сентября 2019

У меня есть такая структура проекта:

myproject
├── Dockerfile
├── setup.py
└── myproject
    └── main.py

Dockerfile выглядит примерно так:

WORKDIR /root/myproject
COPY setup.py .
COPY myproject myproject/
RUN python setup.py install

Проблема в том, что каждый раз, когда я меняю файл и запускаю docker build .Мне нужно подождать, пока setuptools загрузит юниверс.

Я бы хотел сделать это:

WORKDIR /root/myproject
COPY setup.py .
RUN python setup.py install-deps-only # <- this doesn't exist
COPY myproject myproject/
RUN python setup.py install

Таким образом, изменение файла и перестроение будут быстрыми (поскольку установка зависимостей кэшируетсяв нижнем слое изображения докера.

Я вижу этот вопрос: Установка только зависимостей - setuptools , который ищет способ сделать то же самое, но получил больше обходного пути, чем ответ.

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Setuptools с радостью "установят" пакет, каталог пакета которого является пустым каталогом.Пакеты, перечисленные в setup.py, по-прежнему считаются зависимостями, поэтому они загружаются, даже если у них нет кода для import.

Я могу получить то, что хочу, убедившись, что этот каталог пуст вначалеtime setup.py получает консультацию и заполняется во второй раз - в этот момент мой код фактически считается.

Чтобы добиться этого в Dockerfile, просто mkdir dir проекта в отдельном слое, откуда вы копируете содержимоев него:

WORKDIR /root/myproject
COPY setup.py .

# trick pip into thinking the code is there
RUN mkdir myproject

# install my "project"
RUN python setup.py install

# actually place the code
COPY myproject myproject/

# install my project
RUN python setup.py install

Важным элементом было обеспечение того, чтобы код был скопирован на более высоком уровне, чем там, где были установлены зависимости.Второй вызов setup.py происходит каждый раз, когда я делаю изменение кода, но это быстро, потому что мои зависимости уже были загружены.Первый вызов происходит, только если я изменяю setup.py, что вам и нужно.

Это также хорошо работает вне контейнера, потому что там вы можете сделать python setup.py develop, и не нужно запускать setuptools длякаждое изменение.

1 голос
/ 21 сентября 2019

Я структурирую требования в своем файле setup.py следующим образом:

with open('requirements.txt') as f:
    requirements = f.read().splitlines()

Таким образом, require.txt - это файл, который можно передать в pip следующим образом:

$ pip install -r requirements.txt

Неконечно, если это что-то, что вы могли бы рассмотреть в качестве обходного пути, но это хорошо работает для меня в очень похожем сценарии.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...