Как сценарий в контейнере Docker может дать другой результат при запуске с CMD и при запуске в интерактивном режиме? - PullRequest
0 голосов
/ 07 мая 2020

У меня есть образ Docker с установленным GDAL. В Dockerfile последняя команда - CMD ["python", "script.py"]. Этот сценарий Python запускает gdalwarp с subprocess.run().

Я запускал сценарий двумя разными способами, и каждый из них дает разные результаты.

  • «Изнутри» контейнер в интерактивном режиме с docker run -it <image_name> bash, а затем python script.py, это дает ожидаемый результат

gdalinfo output:

Driver: GTiff/GeoTIFF
Files: file.tif
       file.XML
Size is 19771, 19771
Coordinate System is:
GEOGCRS["WGS 84",
    DATUM["World Geodetic System 1984",
        ELLIPSOID["WGS 84",6378137,298.257223563,
            LENGTHUNIT["metre",1]]],
    PRIMEM["Greenwich",0,
        ANGLEUNIT["degree",0.0174532925199433]],
    CS[ellipsoidal,2],
        AXIS["geodetic latitude (Lat)",north,
            ORDER[1],
            ANGLEUNIT["degree",0.0174532925199433]],
        AXIS["geodetic longitude (Lon)",east,
            ORDER[2],
            ANGLEUNIT["degree",0.0174532925199433]],
    ID["EPSG",4326]]
Data axis to CRS axis mapping: 2,1
Origin = (16.295439814814817,48.338634259259265)
Pixel Size = (0.000004629629630,-0.000004629629630)
Metadata:
  AREA_OR_POINT=Area
  METADATATYPE=DIMAP
Image Structure Metadata:
  INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left  (  16.2954398,  48.3386343) ( 16d17'43.58"E, 48d20'19.08"N)
Lower Left  (  16.2954398,  48.2471019) ( 16d17'43.58"E, 48d14'49.57"N)
Upper Right (  16.3869722,  48.3386343) ( 16d23'13.10"E, 48d20'19.08"N)
Lower Right (  16.3869722,  48.2471019) ( 16d23'13.10"E, 48d14'49.57"N)
Center      (  16.3412060,  48.2928681) ( 16d20'28.34"E, 48d17'34.32"N)
Band 1 Block=19771x1 Type=UInt16, ColorInterp=Red
Band 2 Block=19771x1 Type=UInt16, ColorInterp=Green
Band 3 Block=19771x1 Type=UInt16, ColorInterp=Blue
Band 4 Block=19771x1 Type=UInt16, ColorInterp=Undefined
  • Классическое использование определено CMD: docker run <image_name>, что дает другой результат, GDAL, похоже, теряет информацию о системе координат, а также ее порядок

gdalinfo output:

Driver: GTiff/GeoTIFF
Files: file.tif
       file.XML
Size is 19771, 19771
Origin = (48.247101851844533,16.386972222229545)
Pixel Size = (0.000004629629630,-0.000004629629630)
Metadata:
  METADATATYPE=DIMAP
Image Structure Metadata:
  INTERLEAVE=PIXEL
Corner Coordinates:
Upper Left  (  48.2471019,  16.3869722)
Lower Left  (  48.2471019,  16.2954398)
Upper Right (  48.3386343,  16.3869722)
Lower Right (  48.3386343,  16.2954398)
Center      (  48.2928681,  16.3412060)
Band 1 Block=19771x1 Type=UInt16, ColorInterp=Red
Band 2 Block=19771x1 Type=UInt16, ColorInterp=Green
Band 3 Block=19771x1 Type=UInt16, ColorInterp=Blue
Band 4 Block=19771x1 Type=UInt16, ColorInterp=Undefined

Я встревожен тем, что сценарий и среда в обоих случаях одинаковы. Когда я запускаю скрипт изнутри контейнера, python script.py - первая и единственная выполняемая мной команда.

Что может вызвать такое поведение?

EDIT:

Я также пробовал запустить контейнер следующими способами, которые все дают ошибочные выходы:

  • docker run <image_name> python script.py
  • docker run -it <image_name> python script.py
  • docker run <image_name> bash -c "python script.py"
  • docker run -it <image_name> bash -c "python script.py"
  • docker run <image_name> с CMD ["bash", "-c", "python script.py"]

1 Ответ

0 голосов
/ 12 мая 2020

Проблема возникла из-за отсутствующей переменной окружения.

Подробнее см. этот ответ на ServerFault .

Решением для меня было изменить ENTRYPOINT в моем Dockerfile (обратите внимание на вариант -l):

ENTRYPOINT ["/bin/bash", "-l", "-c"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...