【问题标题】:How can I create a Docker image to run both Python and R?如何创建 Docker 映像以同时运行 Python 和 R?
【发布时间】:2019-01-30 09:16:05
【问题描述】:

我想将主要在 Python 中开发但依赖于在 R 中训练的模型的代码管道容器化。对于两个代码库所需的要求和包还有一些额外的依赖关系。如何创建一个 Docker 映像,让我可以构建一个容器来同时运行此 Python 和 R 代码?

对于上下文,我有一个运行模型(随机森林)的 R 代码,但它需要是用 Python 构建的数据管道的一部分。 Python 管道首先执行一些功能并为模型生成输入,然后使用该输入执行 R 代码,然后将输出带到 Python 管道的下一个阶段。

所以我通过编写一个简单的测试 Python 函数来调用 R 代码(导入子流程包的“test_call_r.py”)为此过程创建了一个模板,并且需要将其放入具有必要要求的 Docker 容器中以及适用于 Python 和 R 的软件包。

我已经能够为 Python 管道本身构建 Docker 容器,但无法成功安装 R 和相关软件包以及 Python 要求。我想重写 Dockerfile 来创建一个图像来做到这一点。

从 Dockerhub 文档中,我可以使用例如

为 Python 管道创建一个映像
FROM python:3
WORKDIR /app
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app
CMD [ "python", "./test_call_r.py" ]

与 Dockerhub 类似,我可以使用基本 R 映像(或 Rocker)来创建可以运行 randomForest 模型的 Docker 容器,例如,

FROM r-base
WORKDIR /app    
COPY myscripts /app/
RUN Rscript -e "install.packages('randomForest')"
CMD ["Rscript", "myscript.R"] 

但我需要创建一个可以安装 Python 和 R 的要求和包的映像,并执行代码库以从 Python 中的子进程运行 R。我怎样才能做到这一点?

【问题讨论】:

    标签: python r docker dockerfile devops


    【解决方案1】:

    我为 Python 和 R 构建的 Dockerfile 以这种方式与它们的依赖项一起运行是:

    FROM ubuntu:latest
    
    ENV DEBIAN_FRONTEND=noninteractive
    
    RUN apt-get update && apt-get install -y --no-install-recommends build-essential r-base r-cran-randomforest python3.6 python3-pip python3-setuptools python3-dev
    
    WORKDIR /app
    
    COPY requirements.txt /app/requirements.txt
    
    RUN pip3 install -r requirements.txt
    
    RUN Rscript -e "install.packages('data.table')"
    
    COPY . /app
    

    构建镜像、运行容器(这里命名为SnakeR)和执行代码的命令是:

    docker build -t my_image .
    docker run -it --name SnakeR my_image
    docker exec SnakeR /bin/sh -c "python3 test_call_r.py"
    

    我把它当成一个 Ubuntu 操作系统,构建镜像如下:

    • 在 R 安装期间抑制选择位置的提示;
    • 更新apt-get;
    • 设置以下安装标准:
      • y = 用户提示继续(例如内存分配);
      • 只安装推荐的,不推荐的依赖;
    • 包括一些Ubuntu必备的安装包;
    • R 软件的 r-base;
    • r-cran-randomforest 强制软件包可用(与单独安装的 data.table 不同,由于某种原因不适用于 randomForest);
    • python3.6版python;
    • python3-pip 允许使用 pip 安装需求;
    • python3-setuptools 以某种方式帮助执行 pip 安装 (?!);
    • python3-dev 执行 JayDeBeApi 安装作为要求的一部分(否则它会混淆 Python2 而不是 3);
    • 将活动“工作目录”指定为 /app 位置;
    • 复制包含 python 依赖项的需求文件(从 Python 代码库的虚拟环境构建,例如,使用 pip freeze);
    • 从需求文件安装 Python 包(pip3 for Python3);
    • 安装 R 包(例如这里只是 data.table);
    • 将目录内容复制到指定的工作目录/app。

    这是从我在https://datascienceunicorn.tumblr.com/post/182297983466/building-a-docker-to-run-python-r的博客文章中复制的

    【讨论】:

    • 干得好,Jaydog!如何在您的示例中指定我想要的 R 版本?
    • 谢谢卡罗,好问题!我不确定,因为 r-base 似乎是可用的最新版本。这个问题可能会有所帮助:stackoverflow.com/questions/54239485/…
    【解决方案2】:

    同时针对 Python 和 R 版本进行具体说明将为您省去未来的麻烦。例如,这种方法将始终安装 R v4.0 和 Python v3.8

    FROM r-base:4.0.3
    ENV DEBIAN_FRONTEND=noninteractive
    RUN apt-get update && apt-get install -y --no-install-recommends build-essential libpq-dev python3.8 python3-pip python3-setuptools python3-dev
    RUN pip3 install --upgrade pip
    
    ENV PYTHONPATH "${PYTHONPATH}:/app"
    WORKDIR /app
    
    ADD requirements.txt .
    ADD requirements.r .
    
    # installing python libraries
    RUN pip3 install -r requirements.txt
    
    # installing r libraries
    RUN Rscript requirements.r
    

    你的 requirements.r 文件应该是这样的

    install.packages('data.table')
    install.packages('jsonlite')
    ...
    

    【讨论】:

      【解决方案3】:

      我为我的个人项目制作了一张图片,如果你愿意,可以使用它:https://github.com/dipayan90/docker-python-r

      【讨论】:

        猜你喜欢
        • 2019-12-08
        • 1970-01-01
        • 1970-01-01
        • 2017-04-24
        • 1970-01-01
        • 2020-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多