在Docker容器中运行脚本的脚本

时间:2019-08-22 14:36:55

标签: docker rstudio r-base

这个想法是在docker容器中运行一个R脚本。 R脚本工作正常。这是此R脚本的一部分。 R sript创建文件alpha.csv。脚本不启动。如果我从根目录Rscript /home/script/master.R手动运行脚本,则会收到错误消息。

错误消息

Error in file(file, ifelse(append, "a", "w")) :
cannot open the connection
Calls: write.csv -> eval.parent -> eval -> eval -> write.table -> file
In addition: Warning message:
In file(file, ifelse(append, "a", "w")) :
cannot open file '../output/alpha.csv': No such file or directory
Execution halted

我将脚本复制到容器中的/home/master.r

这是我的dockerfile

From rocker/r-base:latest

# Create directories
RUN mkdir -p home/data home/output home/script

# Copy files
COPY /src/data/test.csv /home/data/test.csv
COPY /src/master.R /home/script/master.R
COPY /src/install_packages.R /home/script/install_packages.R

# Install R-packages
RUN Rscript /home/script/install_packages.R

# Run the script
CMD Rscript /home/script/master.R

第二个问题是,我需要粗鲁。所以我尝试了这个:

install.packages('groff', dependencies = TRUE, repos='http://cran.us.r-project.org')

Te错误消息

Installing package into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)
Warning message:
package ‘groff’ is not available (for R version 3.6.1) 
Installing package into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)
Warning message:
package ‘pandoc’ is not available (for R version 3.6.1)

如何运行容器?我尝试过:

docker run -it --rm test

1 个答案:

答案 0 :(得分:1)

关于第一个问题,您应该将WORKDIR指令设置为/ home / script,关于groff,我不知道任何具有该名称的R包,但是我对命令本身很熟悉,我想您想要已经安装了。

这应该是生成的Dockerfile:

FROM rocker/r-base:latest

RUN apt-get update  \
    && apt-get install -yq --no-install-recommends groff \
    && rm -rf /var/lib/apt/lists/*

# Create directories
RUN mkdir -p /home/data /home/output /home/script

WORKDIR /home/script

# Install R-packages
COPY ./src/install_packages.R /home/script/install_packages.R
RUN Rscript /home/script/install_packages.R

# Copy data
COPY ./src/data/test.csv /home/data/test.csv
COPY /src/master.R /home/script/master.R

# Run the script
CMD Rscript /home/script/master.R

关于Dockerfile的编写,建议您检查https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

如果您的data.csv文件经常更改,我建议避免在Docker映像中复制它,而在容器启动时挂载该文件夹。我想您想在执行完成后访问输出文件,然后我也应该挂载输出文件夹。您可以以以下命令为例:

docker build --tag newtest .
docker run \
  -it --rm \
  -v "$(pwd)/src/data/:/home/data/" \
  -v "$(pwd)/src/output/:/home/output/" \
  newtest