r - 如何找到文件在容器内的位置?
问题描述
我正在尝试为位于容器内的文件提供特殊权限,但我收到“没有这样的文件或目录”错误消息。
Dockerfile 基本上运行一个 R 脚本,该脚本生成一个 output.pptx 文件,该文件位于容器内创建的输出文件夹内。
我想将该输出发送到 s3 存储桶中,但由于某种原因,它在容器内找不到文件。
# Make the output directory
RUN mkdir output
# Process main file
CMD ["RScript", "Script.R"]
# install AWS CLI
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
RUN unzip awscliv2.zip
RUN ./aws/install -i /usr/local/bin/aws -b /usr/local/bin
# run AWS CLI to push output file to s3 folder
RUN chmod 775 ./output/*.pptx
RUN aws s3 cp ./output/*.pptx s3://bucket
这可能与我用于文件的路径有关吗?
解决方案
(编辑以修复第一个版本中的单词交换脑放屁。)
我知道应该如何使用图像存在误解。也就是说, aDOCKERFILE
创建了一个图像,而CMD
在构建图像时它实际上并没有运行。
前面:
- 图像实际上只是带有文件系统的 tarball ;那里有多个“层”,以指示构建过程的层(可以压扁);图像没有“运行”组件,图像中没有进程处于活动状态;和
- 容器是处于运行状态的镜像。它可能是
CMD
您指定的,也可能是其他东西(例如,docker run -it --rm myimage /bin/bash
以容器作为文件系统/环境运行 bash shell)。当运行命令完成并退出时,容器将停止。
通常,您“一次”创建映像(尽管有安全更新等),然后根据需要运行它(手动或通过某些触发器,例如 cron 或 CI 触发器)。这可能看起来像
docker run --rm myimage # using the default `CMD`
docker run --rm myimage R Script.R # specifying the command manually
有几个假设:
- 图像已
R
安装并在PATH
...内,尽管您可以指定完整的/path/to/bin/R
;和 - 默认工作目录(dockerfile 的
WORKDIR
指令)包含Script.R
... 或者您可以指定完整的内部路径Script.R
使用此工作流程,我建议进行一些更改:
从
DOCKERFILE
,删除之后的行# run AWS CLI
;添加
Script.R
步骤以将文件复制到您的 S3 实例,或者使用awscli
您在映像中安装的,或者使用aws.s3
R 包(这可能排除安装 awscli 的需要);我不使用 AWS S3,但我怀疑您需要凭证才能访问存储桶;处理图像和“秘密”(如 S3 凭证)的方法有很多,最简单的方法是将凭证硬编码到容器中,这是一种安全风险;其他涉及“码头机密”或环境变量。例如,
docker run -it --rm -e "S3TOKEN=asldkfjlaskdf"
尽管即使这样也可能被 docker 主机上的相邻用户拦截。
推荐阅读
- forms - VS 2019 安装程序未对目标安装文件夹应用适当的权限
- karate - 如何通过空手道 DSL 中的先前场景响应创建动态 URL
- html - 嵌套单元格保持在右侧,而您可以在单元格左侧正常键入
- git - 从cherry pick获取文件到某个提交
- integration - DocuSign CLM API + 核心 API
- javascript - 延迟加载被外部慢速加载脚本阻止的图像
- r - 有没有办法检查数据框是否为空,如果是则添加 NA 行?
- javascript - 如何在 Google Chrome 中自动漂亮地打印所有 javascript 文件?
- c++ - 使用 CreateProcess() 创建的 cmd.exe 不会从 WriteFile() 读取
- mysql - MySQL .Net 连接器 8.0.26 不适用于 MySql 服务器 5.7.23