【问题标题】:/usr/local/lib64/R/lib/libR.so: cannot open shared object file: No such file or directory/usr/local/lib64/R/lib/libR.so:无法打开共享对象文件:没有这样的文件或目录
【发布时间】:2021-10-30 22:04:18
【问题描述】:

我在 lambda 上通过 docker 制作图像时遇到此错误。

** [ERROR] OSError: cannot load library '/usr/local/lib64/R/lib/libR.so': /usr/local/lib64/R/lib/libR.so: cannot open shared object file : 没有这样的文件或目录**

Docker 文件:

FROM public.ecr.aws/lts/ubuntu:latest
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y wget
RUN apt-get install -y software-properties-common
RUN apt-get install -y gcc gfortran build-essential
RUN apt-get update
RUN apt-get install -y libcurl4-openssl-dev
RUN apt-get install -y zlib1g zlib1g-dev libbz2-dev liblzma-dev libpcre++-dev libpango1.0-dev \
    xorg-dev \
    libreadline-dev
RUN wget -c https://cran.r-project.org/src/base/R-3/R-3.5.0.tar.gz && tar -xf R-3.5.0.tar.gz
RUN cd R-3.5.0 && ./configure --with-readline=no --with-x=no && make && make install
RUN R -e "install.packages('remotes', repos = 'http://cran.us.r-project.org')"
RUN R -e "require(remotes)"
RUN R -e "remotes::install_version('text2vec', version = '0.5.1', repos = 'http://cran.us.r-project.org')"
RUN export LD_LIBRARY_PATH="/usr/local/lib64:$LD_LIBRARY_PATH"
COPY requirements.txt ./
RUN apt-get update && apt-get install -y \
    python3.8 \
    python3-pip
RUN pip3 install -r requirements.txt
RUN pip3 install \
    awslambdaric
RUN ln -s /usr/lib64/R/lib/* /usr/local/lib64/R/lib/
COPY lambda_function.py ./
ENTRYPOINT [ "/usr/bin/python3", "-m", "awslambdaric" ]
CMD ["lambda_function.lambda_handler"]

任何帮助将不胜感激!

【问题讨论】:

  • 在构建 R 时添加标志 --enable-R-shlib,但也许“站在巨人的肩膀上”并使用 github.com/rocker-org/rocker-versioned2 会更好?这是用于在该项目中构建 R 的脚本github.com/rocker-org/rocker-versioned2/blob/master/scripts/…
  • 一般no such file or directory表示用户没有访问权限。 ls -la /usr/local/lib64/R/lib | more 将显示可能从“/usr/lib64/R/lib”复制的权限,因为“/usr/local/lib64/R/lib”是上面的符号链接(RUN ln -s)。 chown 你的 '/usr/local/lib64/R/lib` 让你自己访问。为什么选择 R-3.5.0?
  • @MartinMorgan 没用
  • 我们提供了许多版本的基础容器作为摇杆/r-base,它们也是官方的 r-base 容器,所以你可以拉r-base:3.5.0(虽然我没有像那样回去但我以其他方式使用它们)。这些使用具有正确设置的官方 Debian 二进制文件,包括共享库构建。 (而且我是二进制文件和这些容器的维护者。)

标签: r object aws-lambda


【解决方案1】:

我将 Dockerfile 的第一部分清理为

FROM public.ecr.aws/lts/ubuntu:latest
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get install -y \
        wget \
        software-properties-common \
        gcc gfortran build-essential \
        libcurl4-openssl-dev \
        zlib1g zlib1g-dev libbz2-dev liblzma-dev libpcre++-dev libpango1.0-dev \
        xorg-dev \
        libreadline-dev && \
        apt-get clean && \
        rm -rf /var/lib/apt/lists/*
RUN wget -c https://cran.r-project.org/src/base/R-3/R-3.5.0.tar.gz && \
        tar -xf R-3.5.0.tar.gz && \
        cd R-3.5.0 && \
        ./configure --with-readline=no --with-x=no --enable-R-shlib && \
        make -j && make install

将所有 apt-get 放入一个 RUN 中,可以通过删除 apt 缓存文件进行清理。使用make -j 并行构建R,可以显着加快构建速度。

然后我构建它,并使用 bash 启动生成的图像以查看 libR.so 确实存在。

$ docker build .
...
Successfully built f1d83e97e8ef
$ docker run -it --rm f1d83e97e8ef bash
root@add29666d5d5:/# ls -l /usr/local/lib64/R/lib
total 21984
-rwxr-xr-x 1 root root 16815248 Sep  5 14:43 libR.so
-rwxr-xr-x 1 root root   462896 Sep  5 14:43 libRblas.so
-rwxr-xr-x 1 root root  5226296 Sep  5 14:43 libRlapack.so

libR.so 存在且权限(所有人的读取和执行)是适当的。

我认为没有必要导出 LD_LIBRARY_PATH 或创建符号链接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 2017-06-15
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 2021-07-13
    • 2015-04-12
    相关资源
    最近更新 更多