Установленные пакеты Python исчезают во время многоуровневой сборки Docker

#python #docker #pip #package

#python #docker #pip #пакет

Вопрос:

У меня есть корневой образ, который помечен как repo_a/image_a . Его Dockerfile выглядит так

 FROM some_repo/some_image

# ...

RUN pip3 install https://$authToken:x-oauth-basic@github.com/library_a/archive/v0.0.1.tar.gz

# ...
 

library_a это пользовательская библиотека python, используемая setuptools для установки. Его установочный файл выглядит следующим образом

 setuptools.setup(
    name=library_a
    version=...,
    author=...,
    author_email=...,
    description=...,
    url=...,
    entry_points={
        'console_scripts': [
            'luigim = ....luigim:main',
            'luigip = ....luigip:main'
        ]
    },
    include_package_data=True,
    packages=setuptools.find_packages(),
    install_requires=[
        'luigi==3.0.3',
        'boto3==1.18.52',
        'influxdb',
        'boto',
        'paramiko',
        'termcolor',
        'retrying'
    ]
)
 

Теперь я использую этот корневой образ для создания другого изображения с тегом like repo_a/custom_image . Его файл Dockerfile выглядит следующим образом

 FROM repo_a/image_a

# ...
RUN pip3 install https://$authToken:x-oauth-basic@github.com/library_b/archive/v0.0.45.tar.gz

RUN pip3 install https://$authToken:x-oauth-basic@github.com/library_c/archive/v1.0.43.tar.gz

# ...
 

Обе библиотеки a и b являются пользовательскими библиотеками Python, также использующими setuptools для установки. Их setup.py s выглядят как

 setuptools.setup(
    name=library_b, #or c
    version=...,
    author=...,
    author_email=...,
    description=...,
    url=...,
    include_package_data=True,
    packages=setuptools.find_packages(),
    install_requires=[
        'luigi==3.0.3'
    ]
)
 

Это успешно построено, но моя проблема в том, что library_a установленный в repo_a/image_a больше не установлен repo_a/custom_image . Чтобы быть более конкретным:

Библиотеки library_b и library_c правильно установлены в конечном изображении — я вижу оба в результате pip3 freeze . К сожалению, я не могу их использовать, поскольку они зависят от library_a того, что не отображается в pip3 freeze выходных данных

Если я удалю pip3 установки из второго файла docker, library_a их можно найти в конечном изображении — я вижу library_a результат pip3 freeze и могу успешно импортировать их в python3 REPL.

Итак, что здесь происходит? похоже, что второй набор pip3 install теней pip3 install , по которому прошел первый repo_a/image_a . Почему это так? Что я делаю не так?

Комментарии:

1. Вы пробовали установить все три библиотеки в repo_a/custom_image ? Просто чтобы проверить, не вызывают ли они удаление library_a

2. @QuentinCaffeino К сожалению, это не вариант

3. Я понимаю, что у вас есть конечная цель, но я попросил сделать это только для проверки моего предположения. Может ли быть так, что запуск pip install также удаляет этот пакет. Также для анализа сборки вы можете использовать программу ‘dive’. Он показывает каждый слой, какой commahd был выполнен и что изменилось в файловой системе.

4. @QuentinCaffeino Я исправил это хакерским способом, но я думаю, что буду придерживаться этого. Мне пришлось переустановить library_a во втором dockerfile plus pip3 install boto , и pip3 install retrying поскольку они также не были установлены после library_a установки, хотя они включены в обязательный список.

5. Это github.com/wagoodman/dive инструмент потрясающий