Скрипт для запуска скрипта в 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
Другие вопросы по тегам