Скрипт для запуска скрипта в Docker-контейнере
Идея состоит в том, чтобы запустить скрипт R в Docker-контейнере. Скрипт R работает отлично. Вот часть этого скрипта R Скрипт R создает файл alpha.csv. Сценарий не запускается. Если я запускаю скрипт вручную из корневого каталога Rscript /home/script/master.RI, получаю сообщение об ошибке.
Сообщение об ошибке
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 в контейнере
Вот мой докерфайл
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
Вторая проблема в том, что мне нужно groff. Итак, я попробовал это:
install.packages('groff', dependencies = TRUE, repos='http://cran.us.r-project.org')
Сообщение об ошибке
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 ответ
Что касается первой проблемы, вы должны установить директиву 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 build --tag newtest .
docker run \
-it --rm \
-v "$(pwd)/src/data/:/home/data/" \
-v "$(pwd)/src/output/:/home/output/" \
newtest