首页 > 解决方案 > 如何找到文件在容器内的位置?

问题描述

我正在尝试为位于容器内的文件提供特殊权限,但我收到“没有这样的文件或目录”错误消息。

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

这可能与我用于文件的路径有关吗?

标签: ramazon-web-servicesdockeramazon-s3dockerfile

解决方案


编辑以修复第一个版本中的单词交换脑放屁。)

我知道应该如何使用图像存在误解。也就是说, 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.s3R 包(这可能排除安装 awscli 的需要);

  • 我不使用 AWS S3,但我怀疑您需要凭证才能访问存储桶;处理图像和“秘密”(如 S3 凭证)的方法有很多,最简单的方法是将凭证硬编码到容器中,这是一种安全风险;其他涉及“码头机密”或环境变量。例如,

    docker run -it --rm -e "S3TOKEN=asldkfjlaskdf"
    

    尽管即使这样也可能被 docker 主机上的相邻用户拦截。


推荐阅读