Загрузчик 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), дает мгновенный стандартный вывод, буферизация происходит без него для другого объяснения (возможно, лучше, чем у меня).

Другие вопросы по тегам