这个想法是在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
答案 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