如何创建同时运行Python和R的Docker映像?

时间:2019-01-30 09:16:05

标签: python r docker dockerfile devops

我想将主要在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。我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:3)

我为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;
  • 允许使用pip安装要求的python3-pip;
  • python3-setuptools,以某种方式帮助执行pip安装(?!);
  • python3-dev来执行JayDeBeApi安装作为要求的一部分(否则会引起混淆的是Python2,而不是3);
  • 指定活动的“工作目录”为/ app位置;
  • 复制包含python依赖项的需求文件(从python代码库的虚拟环境中构建,例如pip冻结);
  • 从需求文件(Python3的pip3)安装Python软件包;
  • 安装R软件包(例如,仅在此处安装data.table);
  • 将目录内容复制到指定的工作目录/ app。

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

答案 1 :(得分:3)

同时针对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')
...

答案 2 :(得分:0)

我为个人项目制作了图像,如果需要,可以使用此图像:https://github.com/dipayan90/docker-python-r