Сборка образа Docker не работает для glmnet и Amazon Linux

Я создаю 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) устанавливаются правильно. Как я могу это решить?

Компилятор, хотя и присутствует, вероятно, слишком близок к этому (не очень дружелюбному к разработчикам) дистрибутиву. В CentOS и подобных есть (было?) что-то под названием devtoolset, оно, вероятно, понадобится вам для борьбы с отмыванием денег.

Ada Lovelace 03.06.2024 17:44

На самом деле, судя по вашему журналу ошибок, ситуация еще хуже: recompile with -fPIC Это означает, что R передает пакету неверные параметры компиляции. Ни одна из этих проблем не связана с источниками Rcpp, а связана с тем, как Rcpp устанавливается в AML.

Ada Lovelace 04.06.2024 02:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я обнаружил, что вы можете добавить флаг -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

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