Docker子镜像如何执行父镜像安装R包后的R脚本?
问题原因
你在R目录构建package:first镜像时,安装ggplot2的操作是通过CMD在容器运行阶段执行的——这意味着包只被安装在临时启动的容器实例里,并没有被固化到package:first镜像本身。后续Code目录基于该镜像构建的test镜像自然不包含ggplot2,运行时必然会提示找不到包。
解决步骤
1. 修改R目录的Dockerfile,把包安装放到镜像构建阶段
将R/Dockerfile中的CMD改为RUN,确保包在构建镜像时就被安装并保存到镜像中:
#### INITIAL SETUP FROM r-base:4.2.2 # Copy packages.txt COPY . /home/ # Define the working directory WORKDIR /home/ # 构建镜像时直接安装依赖包,替换原来的CMD RUN Rscript ./packages.R
2. 重新构建R目录的基础镜像
进入R目录,执行构建命令覆盖原有的package:first镜像:
cd R docker build -t package:first .
(无需再执行docker run,因为包安装已在构建阶段完成)
3. 修改Code目录的Dockerfile,添加自动执行命令
在Code/Dockerfile末尾添加CMD,指定容器启动后自动执行Rscript iris.R:
#### INITIAL SETUP FROM package:first # Set an environment variable at runtime for the separate directory ENV MAINDIR /home/ # Copy the file to a path in the container COPY . ${MAINDIR} # Set working directory WORKDIR $MAINDIR # 容器启动时自动执行脚本 CMD ["Rscript", "iris.R"]
4. 重新构建并运行Code目录的镜像
进入Code目录,执行构建和运行命令:
cd ../Code docker build -t test . docker run -t test
此时容器启动后会自动执行iris.R,且能正常找到ggplot2包。
内容的提问来源于stack exchange,提问作者Clarinetist
相关产品推荐
相关产品推荐

