2017-07-04 35 views
-1

首先,我对Docker本身及其结构缺乏了解。我知道,首先要学习基础知识会更有益,但我确实需要这样做才能继续前进到其他方面。将在Dockerfile中下载的文件移动到硬盘

因此,在我安装的Dockerfile中,使用wget &从网站下载文件,认证&下载成功。然而,当我后来尝试移动所述文件时,找不到它,并且它不显示使用例如资源管理器(路径被指定) 我认为它可能与运行有关&它如何执行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中使用它们。

+0

[Docker - 从容器复制文件到主机]的可能重复(https://stackoverflow.com/questions/22049212/docker-copy-file-from-container-to-host) – dimo414

+0

我意识到,这就是为什么我我在问如何移动它们;我知道这是可能的使用CP,但我还没有能够找到使用的容器的ID尚未。 – AscendedKitten

+0

您是否试图在Docker容器内或主机上使用该文件? – jdno

回答

2

简而言之,这是不可能的。

Dockerfile 构建图像,您可以将其作为短期容器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但无法直接执行的情况时,这可能非常有用。

+0

非常感谢!可悲的是我不能改变环境,因为这是我得到的任务,但尝试命令导致“非法选项”错误,然后返回非零代码2.我假设我仍然可以使用参数,如--auth对认证没有挑战? – AscendedKitten

+1

是的,这是您在Docker中捆绑/分发的普通ol'wget'。您可以使用'docker run sherylynn/wget wget --help'来查看所有可用选项的列表(应该与您当地的完全相同)。 – jdno

+0

这同样适用于Dockerfile吗?我想我不得不使用'VOLUME',但它是否允许相同的功能? – AscendedKitten

0

使用wget -O,而不是-P特定的文件下载

用于例如,

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

谢谢

+0

感谢您的回答,尽管它似乎并没有改变虚拟机“关闭”后文件已经消失的事实。 – AscendedKitten

相关问题