Загрузчик Skyfield.api ведет себя по-разному в Docker-контейнере
Я хотел бы указать Skyfield каталог загрузки, как описано здесь:
http://rhodesmill.org/skyfield/files.html
Вот мой сценарий:
from skyfield.api import Loader
load = Loader('~/data/skyfield')
# Next line downloads deltat.data, deltat.preds, Leap_Second.dat in ~/data/skyfield
ts = load.timescale()
t = ts.utc(2017,9,13,0,0,0)
stations_url = 'http://celestrak.com/NORAD/elements/stations.txt'
# Next line downloads stations.txt in ~/data/skyfield AND deltat.data, deltat.preds, Leap_Second.dat in $PWD !!!
satellites = load.tle(stations_url)
satellite = satellites['ISS (ZARYA)']
Ожидаемое поведение (отлично работает вне докера)
3 файла deltat (deltat.data, deltat.preds и Leap_Second.dat) загружаются в ~/data/skyfield с load.timescale()
и Station.txt загружается в то же место с load.tle(stations_url)
Поведение при запуске в контейнере
3 файла deltat загружаются дважды:
- один раз в указанной папке при звонке
load.timescale()
- в другой раз в текущем каталоге на звонок
load.tle(stations_url)
Это расстраивает, потому что они уже существуют на данный момент, и они загрязняют текущий каталог. Обратите внимание, что станции .txt в конечном итоге в правильном месте (~/data/skyfield)
Если контейнер запускается в интерактивном режиме, то вызов exec(open("script.py").read())
в оболочке Python снова дает нормальное поведение. Кто-нибудь может воспроизвести эту проблему? Трудно сказать, идет ли речь о питоне, докере или скайфилде.
Dockerfile - это всего лишь две строки:
FROM continuumio/anaconda3:latest
RUN conda install -c astropy astroquery && conda install -c anaconda ephem=3.7.6.0 && pip install skyfield
Затем (при условии, что встроенное изображение помечено звездочкой), я запускаю его с:
docker run --rm -w /tmp/working -v $PWD:/tmp/working astro:latest python script.py
А вот и результат (при условии, что папки пусты до запуска):
[#################################] 100% deltat.data
[#################################] 100% deltat.preds
[#################################] 100% Leap_Second.dat
[#################################] 100% stations.txt
[#################################] 100% deltat.data
[#################################] 100% deltat.preds
[#################################] 100% Leap_Second.dat
РЕДАКТИРОВАТЬ
Добавление -t к запуску Docker не решило проблему, но помогло даже лучше ее проиллюстрировать. Я думаю, что это может быть из Skyfield, потому что некоторые недавние проблемы на github кажутся довольно похожими, хотя не совсем такими же.
1 ответ
Простое решение здесь состоит в том, чтобы добавить -t
на ваш docker run
Команда для выделения псевдо TTY:
docker run --rm -t -w /tmp/working -v $PWD:/tmp/working astro:latest python script.py
То, что вы видите, вызвано тем, как печатаются строки, и буферизацией вывода, не основанного на TTY. Процент до 100%, скорее всего, напечатан в строке без перевода строки. Затем через 100% он снова печатается с новой строкой. При буферизации это приводит к тому, что оно печатается дважды.
Когда вы запускаете ту же команду с TTY, буферизация не выполняется, и строки печатаются в реальном времени, поэтому новые строки фактически работают так, как вам нужно.
Путь к коду на самом деле не выполняется дважды:)
См. Docker, запущенный с псевдо TTY (-t), дает мгновенный стандартный вывод, буферизация происходит без него для другого объяснения (возможно, лучше, чем у меня).