Я создаю Dockerfile для запуска рабочих нагрузок R в Lambda на основе шаблона из пакета lambdr, который основан на базовом образе Amazon Linux и менеджере пакетов yum. Мне нужен glmnet для одной из рабочих нагрузок, которые я хочу запустить. Однако я не могу установить glmnet, поскольку, похоже, возникла проблема с компиляцией.
Это начало моего Dockerfile:
FROM public.ecr.aws/lambda/provided:al2-x86_64
ENV R_VERSION=4.4.0
# Installs wget, git, tar, gcc and other development libraries
RUN yum -y install wget git tar gcc gcc-c++ libcurl-devel openssl-devel libxml2-devel
# Install EPEL
RUN yum -y install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm \
# Install specific R version
&& wget https://cdn.rstudio.com/r/centos-7/pkgs/R-${R_VERSION}-1-1.x86_64.rpm \
&& yum -y install R-${R_VERSION}-1-1.x86_64.rpm \
&& rm R-${R_VERSION}-1-1.x86_64.rpm
# Install AWS CLI
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \
&& unzip awscliv2.zip \
&& ./aws/install
# Accept AWS credentials as build arguments
ARG AWS_ACCESS_KEY_ID
ARG AWS_SECRET_ACCESS_KEY
# Set AWS credentials in the environment
ENV AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID}
ENV AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY}
ENV PATH = "${PATH}:/opt/R/${R_VERSION}/bin/"
# Creates a configuration file for R to set the C++ compiler.
RUN mkdir -p /root/.R && echo "CXX17 = g++" >> /root/.R/Makevars
RUN Rscript -e "install.packages('glmnet', \
INSTALL_opts =c('--no-docs', '--no-data',\
'--no-help', '--no-demo'),\
repos = 'https://packagemanager.rstudio.com/all/__linux__/centos7/latest')"
затем я звоню
docker build --build-arg AWS_ACCESS_KEY_ID = {AWS_ACCESS_KEY_ID}--build-arg AWS_SECRET_ACCESS_KEY = {AWS_SECRET_ACCESS_KEY} -t r-on-lambda .
Что выводит это в конце:
#11 107.7 /usr/bin/ld: RcppExports.o: relocation R_X86_64_32 against `.bss' can not be used when making a shared object; recompile with -fPIC
#11 107.7 /usr/bin/ld: elnet_exp.o: relocation R_X86_64_32 against `.bss' can not be used when making a shared object; recompile with -fPIC
#11 107.7 /usr/bin/ld: glmnet_init.o: relocation R_X86_64_32 against `.data' can not be used when making a shared object; recompile with -fPIC
#11 107.7 /usr/bin/ld: internal.o: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
#11 107.7 /usr/bin/ld: pb_exp.o: relocation R_X86_64_32 against `.bss' can not be used when making a shared object; recompile with -fPIC
#11 107.7 /usr/bin/ld: wls_exp.o: relocation R_X86_64_32 against `.bss' can not be used when making a shared object; recompile with -fPIC
#11 107.7 /usr/bin/ld: final link failed: Nonrepresentable section on output
#11 107.7 collect2: error: ld returned 1 exit status
#11 107.7 make: *** [glmnet.so] Error 1
#11 107.7 ERROR: compilation failed for package ‘glmnet’
#11 107.7 * removing ‘/opt/R/4.4.0/lib/R/library/glmnet’
#11 107.8
#11 107.8 The downloaded source packages are in
#11 107.8 ‘/tmp/Rtmp7LKwru/downloaded_packages’
#11 107.8 Updating HTML index of packages in '.Library'
#11 107.8 Making 'packages.html' ... done
#11 107.8 Warning message:
#11 107.8 In install.packages("glmnet", INSTALL_opts = c("--no-docs", "--no-data", :
#11 107.8 installation of package ‘glmnet’ had non-zero exit status
#11 DONE 107.9s
В чем причина того, что glmnet не устанавливается, если у меня установлены gcc и gcc-c++? В журнале я увидел, что все зависимости (foreach, итераторы, Rcpp, RcppEigen, shape) устанавливаются правильно. Как я могу это решить?
На самом деле, судя по вашему журналу ошибок, ситуация еще хуже: recompile with -fPIC Это означает, что R передает пакету неверные параметры компиляции. Ни одна из этих проблем не связана с источниками Rcpp, а связана с тем, как Rcpp устанавливается в AML.





Я обнаружил, что вы можете добавить флаг -fPIC в CXX17, необходимый для glmnet:
Изменение этого:
RUN mkdir -p /root/.R && echo "CXX17 = g++" >> /root/.R/Makevars
Для этого:
RUN mkdir -p /root/.R && \
echo "CXX17 = g++ -fPIC" >> /root/.R/Makevars && \
echo "CXX17FLAGS = -O3 -mtune=native -march=native -Wno-unused-variable -Wno-unused-function" >> /root/.R/Makevars
Компилятор, хотя и присутствует, вероятно, слишком близок к этому (не очень дружелюбному к разработчикам) дистрибутиву. В CentOS и подобных есть (было?) что-то под названием devtoolset, оно, вероятно, понадобится вам для борьбы с отмыванием денег.