【问题标题】:Move file downloaded in Dockerfile to harddrive将 Dockerfile 中下载的文件移动到硬盘
【发布时间】:2017-07-04 06:00:39
【问题描述】:

首先,我真的缺乏很多关于 Docker 本身及其结构的知识。我知道先学习基础知识会更有益,但我确实需要这样做才能继续做其他事情。

因此,我在 Dockerfile 中安装了 wget 并使用它从网站下载文件,验证和下载成功。但是,当我稍后尝试移动所述文件时,找不到它,并且它也没有使用例如资源管理器显示(指定了路径) 我认为这可能与 RUN 以及它如何执行 wget 命令有关;我读到 Id 可用于将其复制到硬盘,但我如何在 Dockerfile 中做到这一点?

RUN wget -P ./path/to/somewhere http://something.com/file.txt --username xyz --password bluh

ADD ./path/to/somewhere/file.txt /mainDirectory

显示下载并成功登录,但正如我提到的,我稍后使用该文件时遇到了问题,因为它不在硬盘上。可能是一个基本错误,但我非常感谢一些可能会导致解决方案的输入。

显然在尝试执行ADD 时会产生错误,因为没有要移动的文件。我正在尝试找到一种方法来安装卷以存储它,但到目前为止是徒劳的。

编辑: 虽然这个问题类似于“移动到硬盘”的问题,但我正在寻找方法来获取在 Dockerfile 中创建的容器的 ID 以便移动它;虽然线程提供了这样的答案,但我没有在 Dockerfile 本身中使用它们。

【问题讨论】:

  • 我意识到,这就是为什么我要问如何移动它们;我知道使用 cp 是可能的,但我还没有找到使用的容器的 id。
  • 您是在 Docker 容器中还是在您的主机上尝试使用该文件?
  • 该文件应该被下载并移动到主目录,然后主机将使用它。到目前为止,我一直在移动文件,因为它只存在于虚拟机中。
  • 查看上面链接的问题。如果您的问题实际上是“我如何找到图像或容器的 ID”,您应该问 that 问题。或者只是阅读文档...

标签: docker virtual-machine dockerfile


【解决方案1】:

简短的回答是这是不可能的。

Dockerfile 构建一个镜像,您可以将其run 作为一个短期容器。在构建期间,您没有(写入)主机及其文件系统的访问权限。这有点道理,因为您想构建一个不可变的映像来运行临时容器。

您可以做的是run 一个容器,并将您主机的路径作为volume 安装到容器中。这是在主机和容器之间共享文件的唯一方法。

这是一个示例,您可以如何使用 sherylynn/wget 图像执行此操作:

docker run -v /path/on/host:/path/in/container sherylynn/wget wget -O /path/in/container/file http://my.url.com

-v HOST:CONTAINER 参数允许您指定主机上的路径,该路径安装在容器内的指定位置。

对于wget,在下载单个文件时,我更喜欢-O 而不是-P,因为它非常明确地说明了下载的最终位置。当您将-O 指向卷的位置时,下载的文件最终会出现在主机系统上(在您安装的文件夹中)。

由于我不知道您的图像或环境是什么样的,因此您可能需要调整一两件事以与您自己的图像完美搭配。作为一般建议:对于wgetcurl 等基本命令,您可以在Docker Hub 上找到预制图像。当您需要设置一个持续集成管道时,这可能非常有用,您想在其中使用wgetcurl 但不能直接执行它。

【讨论】:

  • 非常感谢!可悲的是,我无法更改环境,因为这是给我的任务,但是尝试该命令会导致“非法选项”错误,然后返回非零代码 2。我假设我仍然可以使用 --auth 之类的参数- 不挑战身份验证?
  • 是的,这是您的普通版 wget 捆绑/分发在 Docker 中。您可以使用docker run sherylynn/wget wget --help 查看所有可用选项的列表(应该与您本地的选项完全相同)。
  • 这同样适用于 Dockerfile 吗?我想我必须改用“VOLUME”,但它是否允许相同的功能?
  • 没有。 VOLUMEcontainerrunning 图像)内的路径暴露给 其他容器docker build 就像安装操作系统:它设置了启动程序(即docker run)或共享文件(即卷)所需的一切,但在系统仍在安装时你不能这样做。
  • 不给你的主人,不。在 Docker 构建期间正在进行有关卷的讨论,但尚未做出任何决定:github.com/moby/moby/issues/14080。但是,此功能的用例与您尝试实现的完全不同。我强烈建议您至少掌握一些基础知识,以了解如何完成您正在尝试做的任何事情......
【解决方案2】:

使用 wget -O 代替 -P 下载特定文件

例如,

运行 wget -O /tmp/new_file.txt http://something.com --username xyz --password bluh/new_file.txt

谢谢

【讨论】:

  • 感谢您的回答,尽管它似乎并没有改变虚拟机“关闭”后文件消失的事实。
猜你喜欢
  • 2020-04-05
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
相关资源
最近更新 更多