#python #docker-compose
#python #docker-compose
Вопрос:
Я хочу, чтобы мои пользователи могли ссылаться на файл в моем пакете python (в частности, на файл docker-compose.yml) непосредственно из оболочки.
Я не смог найти способ получить только местоположение из pip show
(и выделение «местоположения» из его вывода выглядит уродливо), поэтому мое текущее (несколько подробное) решение:
docker compose -f $(python3 -c "import locust_plugins; print(locust_plugins.__path__[0])")/timescale/docker-compose.yml up
Есть ли лучший способ?
Редактировать: я решил это, установив команду-оболочку, которую я вызываю locust-compose
как часть пакета. Не идеально, но оно выполняет свою работу:
#!/bin/bash
module_location=$(python3 -c "import locust_plugins; print(locust_plugins.__path__[0])")
set -x
docker compose -f $module_location/timescale/docker-compose.yml "$@"
Ответ №1:
Большая часть поддержки, которая вам нужна для этого, находится в core setuptools suite.
Прежде всего, вам нужно убедиться, что файл данных включен в ваш пакет. В setup.cfg
файле вы можете записать:
[options.package_data]
timescale = docker-compose.yml
Теперь, если вы pip install .
или pip wheel
, это будет включать файл Compose как часть пакета Python.
Затем вы можете получить это в коде Python с помощью ResourceManager
API:
#!/usr/bin/env python3
# timescale/compose_path.py
import pkg_resources
if __name__ == '__main__':
print(pkg_resources.resource_filename('timescale', 'docker-compose.yml'))
И, наконец, вы можете взять этот скрипт и сделать его сценарием точки входа setuptools (в отличие от концепции Docker с аналогичным именем), чтобы вы могли просто запустить его как одну команду.
[options.entry_points]
console_scripts=
timescale_compose_path = timescale:compose_path
Опять же, если вы pip install .
находитесь в виртуальной среде, вы должны иметь возможность запустить timescale_compose_path
и получить имя пути.
Выполнив все эти шаги, вы, наконец, можете запустить более простой
docker-compose -f $(timescale_compose_path) up
Комментарии:
1. Приятно! У меня уже были первые части (хотя я использую MANIFEST.in чтобы включить файл в мой пакет). Я не хочу заставлять своих пользователей запускать virtualenv, поэтому, к сожалению, я не думаю, что смогу использовать ваш подход.
2. Или подождите, может быть, ваше решение действительно не требует virtualenv? Если это так, это очень похоже на мое решение и, возможно, даже лучше. В любом случае, оба наших решения являются более обходными путями того, что я чувствую (желаю), было более простым решением.
3. Для этого не должна специально требоваться виртуальная среда, но для этого требуется, чтобы пакет действительно был установлен с использованием обычных инструментов.