Ошибка компиляции libgdal для AWS AMI
Я пытаюсь установить libgdal в AWS AMI 2 для использования в ECR вместе с привязками Python. Сборка выполняется в контейнере Docker, который предоставляется ECR и содержит Python 3.9.
# Pull the base image with python 3.9 as a runtime for your Lambda
FROM public.ecr.aws/lambda/python:3.9
# install tools (gcc to compile C code during installation, mesa-libGL for OpenCV)
RUN yum install -y yum-plugin-remove-with-leaves tar file.x86_64 sudo make gcc git unzip mesa-libGL gcc-c++.x86_64 cpp.x86_64 sqlite-devel.x86_64 libtiff.x86_64 cmake3.x86_64
RUN python3.9 -m pip install numpy==1.22.4
WORKDIR /tmp
RUN curl https://download.osgeo.org/proj/proj-6.1.1.tar.gz -o proj-6.1.1.tar.gz && \
tar -xvf proj-6.1.1.tar.gz && \
cd proj-6.1.1 && \
ls -l && \
./configure --disable-dependency-tracking && \
make && \
sudo make install && \
cd .. && \
rm -rf proj-6.1.1 && \
rm -f proj-6.1.1.tar.gz
RUN yum install -y which
RUN ls -lr `which python`
RUN git clone --branch patch/3.2.2.1 https://github.com/OSGeo/gdal.git && \
cd gdal/gdal && \
./configure --with-proj=/usr/local --with-python && \
make && \
sudo make install && \
cd ../.. && \
rm -rf gdal
RUN which gdalinfo && \
gdalinfo --version && \
ls -l /usr/include/gdal
Но когдаmake install
выполняется, я получаю следующую ошибку:
(cd port; make install)
make[1]: Entering directory `/tmp/gdal/gdal/port'
for f in cpl_atomic_ops.h cpl_config_extras.h cpl_config.h cpl_conv.h cpl_csv.h cpl_error.h cpl_hash_set.h cpl_http.h cpl_json.h cplkeywordparser.h cpl_list.h cpl_minixml.h cpl_minizip_ioapi.h cpl_minizip_unzip.h cpl_minizip_zip.h cpl_multiproc.h cpl_odbc.h cpl_port.h cpl_progress.h cpl_quad_tree.h cpl_spawn.h cpl_string.h cpl_time.h cpl_virtualmem.h cpl_vsi.h cpl_vsi_error.h cpl_vsi_virtual.h gdal_csv.h cpl_auto_close.h ; do /tmp/gdal/gdal/install-sh -c -m 0644 $f /usr/local/include ; done
make[1]: Leaving directory `/tmp/gdal/gdal/port'
(cd gcore; make install)
make[1]: Entering directory `/tmp/gdal/gdal/gcore'
for f in gdal_frmts.h gdalgeorefpamdataset.h gdal.h gdaljp2abstractdataset.h gdaljp2metadata.h gdal_mdreader.h gdal_pam.h gdal_priv.h gdal_proxy.h gdal_rat.h rawdataset.h gdal_version.h ; do /tmp/gdal/gdal/install-sh -c -m 0644 $f /usr/local/include ; done
make[1]: Leaving directory `/tmp/gdal/gdal/gcore'
(cd frmts; make install)
make[1]: Entering directory `/tmp/gdal/gdal/frmts'
make -C vrt install
make[2]: Entering directory `/tmp/gdal/gdal/frmts/vrt'
/tmp/gdal/gdal/install-sh -c -m 0644 vrtdataset.h /usr/local/include
/tmp/gdal/gdal/install-sh -c -m 0644 gdal_vrt.h /usr/local/include
make[2]: Leaving directory `/tmp/gdal/gdal/frmts/vrt'
make -C mem install
make[2]: Entering directory `/tmp/gdal/gdal/frmts/mem'
/tmp/gdal/gdal/install-sh -c -m 0644 memdataset.h /usr/local/include
make[2]: Leaving directory `/tmp/gdal/gdal/frmts/mem'
make -C raw install
make[2]: Entering directory `/tmp/gdal/gdal/frmts/raw'
make[2]: Nothing to be done for `install'.
make[2]: Leaving directory `/tmp/gdal/gdal/frmts/raw'
make[1]: Leaving directory `/tmp/gdal/gdal/frmts'
(cd alg; make install)
make[1]: Entering directory `/tmp/gdal/gdal/alg'
for f in gdal_alg.h gdal_alg_priv.h gdalgrid.h gdalgrid_priv.h gdalpansharpen.h gdal_simplesurf.h gdalwarper.h ; do /tmp/gdal/gdal/install-sh -c -m 0644 $f /usr/local/include ; done
make[1]: Leaving directory `/tmp/gdal/gdal/alg'
(cd ogr; make install)
make[1]: Entering directory `/tmp/gdal/gdal/ogr'
for f in ogr_core.h ogr_feature.h ogr_geometry.h ogr_p.h ogr_spatialref.h ogr_srs_api.h ogrsf_frmts/ogrsf_frmts.h ogr_featurestyle.h ogr_api.h ogr_geocoding.h ogr_swq.h ; \
do /tmp/gdal/gdal/install-sh -c -m 0644 $f /usr/local/include ; \
done
make[1]: Leaving directory `/tmp/gdal/gdal/ogr'
(cd gnm; make install)
make[1]: Entering directory `/tmp/gdal/gdal/gnm'
for f in gnm.h gnm_api.h gnmgraph.h ; \
do /tmp/gdal/gdal/install-sh -c -m 0644 $f /usr/local/include ; \
done
make[1]: Leaving directory `/tmp/gdal/gdal/gnm'
(cd apps; make install)
make[1]: Entering directory `/tmp/gdal/gdal/apps'
for f in gdalinfo gdal_translate gdaladdo gdalwarp nearblack gdalmanage gdalenhance gdaltransform gdaldem gdallocationinfo gdalsrsinfo gdalmdiminfo gdalmdimtranslate gdal_viewshed gdal_create gdal_contour gdaltindex gdal_rasterize gdal_grid ogrinfo ogr2ogr ogrtindex ogrlineref testepsg gdalbuildvrt gnmmanage gnmanalyse ; do /bin/sh /tmp/gdal/gdal/libtool --mode=install --silent /tmp/gdal/gdal/install-sh -c $f /usr/local/bin ; done
/tmp/gdal/gdal/install-sh -c -m 0644 gdal_utils.h /usr/local/include
/bin/sh /tmp/gdal/gdal/libtool --mode=install --silent /tmp/gdal/gdal/install-sh -c gdal-config-inst /usr/local/bin/gdal-config
make[1]: Leaving directory `/tmp/gdal/gdal/apps'
(cd swig; make install)
make[1]: Entering directory `/tmp/gdal/gdal/swig'
for dir in python ; do (cd $dir; make install) || exit; done
make[2]: Entering directory `/tmp/gdal/gdal/swig/python'
----------------------------------------------------------------------
The GDAL python package has been installed in lib/python2.7/site-packages
Please ensure to add lib/python2.7/site-packages to your PYTHONPATH
----------------------------------------------------------------------
env PYTHONPATH=lib/python2.7/site-packages${PYTHONPATH:+:$PYTHONPATH} \
python setup.py install --single-version-externally-managed --record=record.txt --prefix=/usr/local
/usr/lib64/python2.7/distutils/dist.py:267: UserWarning: Unknown distribution option: 'extras_require'
warnings.warn(msg)
/usr/lib64/python2.7/distutils/dist.py:267: UserWarning: Unknown distribution option: 'long_description_content_type'
warnings.warn(msg)
usage: setup.py [global_opts] cmd1 [cmd1_opts] [cmd2 [cmd2_opts] ...]
or: setup.py --help [cmd1 cmd2 ...]
or: setup.py --help-commands
or: setup.py cmd --help
error: option --single-version-externally-managed not recognized
WARNING: numpy not available! Array support will not be enabled
make[2]: Leaving directory `/tmp/gdal/gdal/swig/python'
make[2]: *** [install] Error 1
make[1]: Leaving directory `/tmp/gdal/gdal/swig'
make[1]: *** [install] Error 2
make: *** [install-actions] Error 2
Раньше я пробовал libgdal версии 3.2.2, но мне нужно было переключиться на 3.2.2.1, которая содержит исправление для установки. Я использую 3.2.2.1, потому что это то, что я установил на свой компьютер разработчика. Может быть, я могу использовать более новую версию libgdal, я просто хочу извлечь координаты GPS для пикселей из TIFF с географической привязкой.
1 ответ
Для дальнейшего использования я использовал это изображение:
https://github.com/lambgeo/докер-лямбда
Прямо сейчас нужно создать package.zip, который вы будете использовать для развертывания лямбды с помощью метода zip-архива . Если вам нужно запустить этот образ в качестве лямбда-образа контейнера AWS, вам необходимо перезаписать в промежуточном образе файла докеры ENTRYPOINTghcr.io/lambgeo/lambda-gdal:3.5-python3.9
(илиghcr.io/lambgeo/lambda-gdal:3.5-python3.8
) с использованием
ENTRYPOINT ["/lambda-entrypoint.sh"]
РЕДАКТИРОВАТЬ: На мой взгляд, образы докеров aws python немного устарели, поэтому в конце концов я переключился на официальный образ из osgeo/gdal (в настоящее время этоosgeo/gdal:ubuntu-small-3.6.1
, на основе Ubuntu 22.04 с Python 3.10).
Чтобы сократить время сборки, я промежуточный образ докера. Здесь я также добавляю поддержку aws lambda и список требований к пакетам python:
# inspired by https://dev.to/gaborschulz/running-python-311-on-aws-lambda-1i7p
FROM osgeo/gdal:ubuntu-small-3.6.1 as build-image
LABEL maintainer="alessandro trinca <alessandro@trinca.tornidor.com>"
# Include global arg in this stage of the build
ARG LAMBDA_TASK_ROOT="/var/task"
ARG PYTHONPATH="${LAMBDA_TASK_ROOT}:${PYTHONPATH}:/usr/local/lib/python3/dist-packages"
RUN mkdir -p ${LAMBDA_TASK_ROOT}
# Install aws-lambda-cpp build dependencies
RUN apt-get update && \
apt-get install -y g++ make cmake unzip libcurl4-openssl-dev python3-pip
# install required packages
COPY requirements_pip.txt ${LAMBDA_TASK_ROOT}/
RUN python -m pip install --target ${LAMBDA_TASK_ROOT} --upgrade -r ${LAMBDA_TASK_ROOT}/requirements_pip.txt
COPY requirements.txt ${LAMBDA_TASK_ROOT}/
RUN python -m pip install --target ${LAMBDA_TASK_ROOT} -r ${LAMBDA_TASK_ROOT}/requirements.txt
FROM osgeo/gdal:ubuntu-small-3.6.1
# Include global arg in this stage of the build
ARG LAMBDA_TASK_ROOT="/var/task"
ARG PYTHONPATH="${LAMBDA_TASK_ROOT}:${PYTHONPATH}:/usr/local/lib/python3/dist-packages"
ARG RIE="https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie"
# Set working directory to function root directory
WORKDIR ${LAMBDA_TASK_ROOT}
# Copy in the built dependencies
COPY --from=build-image ${LAMBDA_TASK_ROOT} ${LAMBDA_TASK_ROOT}
RUN curl -Lo /usr/local/bin/aws-lambda-rie ${RIE}
RUN chmod +x /usr/local/bin/aws-lambda-rie
COPY ./scripts/lambda-entrypoint.sh /lambda-entrypoint.sh
RUN chmod +x /lambda-entrypoint.sh
RUN ls -l /lambda-entrypoint.sh
ENTRYPOINT ["/lambda-entrypoint.sh"]
Вам также необходимо пометить промежуточный образ докера, используя соглашение об именах, дружественное к ECR (однако вам не нужно отправлять его сразу):
docker tag image-name:latest <AWS_ACCOUNT_ID>.dkr.ecr.eu-west-1.amazonaws.com/image-name:latest
Подробнее на подготовил этот собственныйстранице блога .
The lambda-entrypoint.sh
сценарий:
#!/bin/sh
if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then
exec /usr/local/bin/aws-lambda-rie /usr/bin/python -m awslambdaric $@
else
exec /usr/bin/python -m awslambdaric $@
fi
Требования_pip.txt
pip
wheel
setuptools
Последний мой «окончательный» образ докера, основанный на промежуточном образе, который я подготовил ранее:
FROM <AWS_ACCOUNT_ID>.dkr.ecr.eu-west-1.amazonaws.com/image-name:latest
ARG LAMBDA_TASK_ROOT="/var/task"
ARG PYTHONPATH="${LAMBDA_TASK_ROOT}:${PYTHONPATH}:/usr/local/lib/python3/dist-packages"
COPY app.py ${LAMBDA_TASK_ROOT}
CMD [ "app.lambda_handler" ]