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 длякаждое изменение.