作为Docker的第一次尝试,我正在尝试运行一些R代码从Docker容器生成PNG文件。我在Windows 11中使用WSL 2,并且只使用Docker CLI,而不是Docker桌面。
停靠文件
FROM r-base
# Modify the date at build time
ARG WHEN
# Execute R from the terminal
RUN R -e "options(repos = \
list(CRAN = 'http:/mran.revolutionanalytics.com/snapshot/${WHEN}')); \
install.packages('ggplot2')"
# Create a path in the container
RUN mkdir -p /home/
RUN mkdir /home/code
RUN mkdir /home/results
# Copy the file to a path in the container
COPY ./Code/iris.R /home/code/iris.R
WORKDIR /home/code
# Run iris.R in the container
CMD ["Rscript", "iris.R"]
# Copy iris.png
COPY ./iris.png /home/results/iris.png
代码/虹膜R
library(ggplot2)
p <- ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width,
color = Species)) +
geom_point() +
geom_smooth(method = "lm") +
theme_bw() +
theme(panel.grid = element_blank()) +
xlab("Sepal Length") +
ylab("Sepal Width") +
scale_x_continuous(limits = c(4, 8), breaks = seq(4, 8, 0.5)) +
scale_y_continuous(limits = c(2, 5), breaks = 2:5)
ggsave(filename = file.path(getwd(), "iris.png"), plot = p, device = "png")
在Docker CLI中复制问题
$ docker build --build-arg WHEN=2022-12-10 -t plot .
Sending build context to Docker daemon 4.608kB
Step 1/10 : FROM r-base
---> 3de1ef2039fb
Step 2/10 : ARG WHEN
---> Using cache
---> ff24cab2714d
Step 3/10 : RUN R -e "options(repos = list(CRAN = 'http:/mran.revolutionanalytics.com/snapshot/${WHEN}')); install.packages('ggplot2')"
---> Using cache
---> 67b96e10f028
Step 4/10 : RUN mkdir -p /home/
---> Using cache
---> 65e100a0ca92
Step 5/10 : RUN mkdir /home/code
---> Using cache
---> 08506b7b2d44
Step 6/10 : RUN mkdir /home/results
---> Using cache
---> 149966cff268
Step 7/10 : COPY ./Code/iris.R /home/code/iris.R
---> Using cache
---> 5bba4c93e928
Step 8/10 : WORKDIR /home/code
---> Using cache
---> 1b5a8b7ee36b
Step 9/10 : CMD ["Rscript", "iris.R"]
---> Using cache
---> 8c9cc56e90f4
Step 10/10 : COPY ./iris.png /home/results/iris.png
COPY failed: file not found in build context or excluded by .dockerignore: stat iris.png: file does not exist
型
我还尝试注解掉最后一行CMD
和最后一行COPY
,并自己运行Rscript iris.R
。
$ docker build --build-arg WHEN=2022-12-10 -t plot .
Sending build context to Docker daemon 4.608kB
Step 1/8 : FROM r-base
---> 3de1ef2039fb
Step 2/8 : ARG WHEN
---> Using cache
---> ff24cab2714d
Step 3/8 : RUN R -e "options(repos = list(CRAN = 'http:/mran.revolutionanalytics.com/snapshot/${WHEN}')); install.packages('ggplot2')"
---> Using cache
---> 67b96e10f028
Step 4/8 : RUN mkdir -p /home/
---> Using cache
---> 65e100a0ca92
Step 5/8 : RUN mkdir /home/code
---> Using cache
---> 08506b7b2d44
Step 6/8 : RUN mkdir /home/results
---> Using cache
---> 149966cff268
Step 7/8 : COPY ./Code/iris.R /home/code/iris.R
---> Using cache
---> 5bba4c93e928
Step 8/8 : WORKDIR /home/code
---> Using cache
---> 1b5a8b7ee36b
Successfully built 1b5a8b7ee36b
Successfully tagged plot:latest
$ docker run -d plot tail -f /dev/null
dd2395f02f9793f1f4fca53eab904c33f38e9ee0dd3b14bcbdd56cd96693e150
$ docker exec -it dd2395f02f97 bash
root@dd2395f02f97:/home/code# ls
iris.R
root@dd2395f02f97:/home/code# Rscript iris.R
Saving 7 x 7 in image
`geom_smooth()` using formula = 'y ~ x'
root@dd2395f02f97:/home/code# ls
iris.png iris.R
并且 * 在这里 * 它出现了,但是当我尝试自动化这个过程时,它没有出现,如上所述。
我也试过添加--no-cache
,但这并没有解决这个问题。我不清楚这个问题是ggsave()
的还是Docker的。
1条答案
按热度按时间hivapdat1#
多亏了Flick先生的评论,我想出了解决问题的办法。
这里要理解的关键是输出需要存储在容器之外的本地驱动器上,理解MakeFile中任何语句引用的当前目录
.
都将引用挂载目录也很重要。停靠文件
值得注意的是,
COPY iris.R
语句将在将要挂载的目录中查找iris.R
。[您想要输出的位置]/iris.R
坞站CLI
型
现在是关键步骤:
在该目录中执行
ls
会产生这可以根据需要用更复杂的文件夹结构来概括。