如何在不使用ADD或COPY指令的情况下将文件添加到Dockerfile中的图像

前端之家收集整理的这篇文章主要介绍了如何在不使用ADD或COPY指令的情况下将文件添加到Dockerfile中的图像前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

为了编译程序,我需要在Docker容器中的一个大的* .zip文件(5GB)的内容. * .zip文件位于我的本地机器上.这样做的策略是:

COPY program.zip /tmp/
RUN cd /tmp \
&& unzip program.zip \
&& make

完成之后,我想删除解压缩的目录和原始的* .zip文件,因为它们不再需要了.问题是COPY(和ADD指令)将添加一个图层,该图像将包含文件program.zip这是有问题的,因为图像将至少是5gb大.有没有办法在不使用COPY或ADD指令的情况下将文件添加到容器? wget将无法正常工作,因为所提及的* .zip文件位于我的本地机器和卷曲文件://localhost/home/user/program.zip -o /tmp/program.zip将无法正常工作.

最佳答案
这不是直接的,但可以通过wget或curl通过python的一点支持来完成. (所有三种工具通常都可以在* nix系统上使用.)

当没有url被赋予时,wget将无法工作

 curl file://localhost/home/user/program.zip -o /tmp/

不能在Dockerfile的RUN指令中工作.因此,我们将需要一个wget和curl可以访问和下载program.zip的服务器.

为此,我们设置了一个服务于我们的http请求的小型python服务器.我们将使用python的http.server模块. (你可以使用python或python 3.它可以同时使用.)

python -m http.server --bind 192.168.178.20 8000

python服务器将为所有启动的目录中的所有文件提供服务.因此,您应该确保在映像构建所在的文件目录中确定启动服务器,或创建包含程序的临时目录.为了说明的目的,我们创建一个文件foo.txt,我们稍后将通过我们的Dockerfile中的wget下载:

echo "foo bar" > foo.txt

启动http服务器时,重要的是我们在LAN上指定本地机器的IP地址.此外,我们将打开Port 8000.完成此操作后,我们将看到以下输出

python3 -m http.server --bind 192.168.178.20 8000
Serving HTTP on 192.168.178.20 port 8000 ...

现在我们构建一个Docker文件来说明它是如何工作的. (我们假设文件foo.txt应该被下载到/ tmp中):

FROM debian:latest
RUN apt-get update -qq \
&& apt-get install -y wget
RUN cd /tmp \
&& wget http://192.168.178.20:8000/foo.txt

现在我们开始构建

docker build -t test .

在构建期间,您将在我们的python服务器上看到以下输出

172.17.0.21 - - [01/Nov/2014 23:32:37] "GET /foo.txt HTTP/1.1" 200 -

我们的图像的构建输出将是:

Step 2 : RUN cd /tmp && wget http://192.168.178.20:8000/foo.txt
 ---> Running in 49c10e0057d5
--2014-11-01 22:56:15--  http://192.168.178.20:8000/foo.txt
Connecting to 192.168.178.20:8000... connected.
HTTP request sent,awaiting response... 200 OK
Length: 25872 (25K) [text/plain]
Saving to: `foo.txt'

     0K .......... .......... .....                           100%  129M=0s

2014-11-01 22:56:15 (129 MB/s) - `foo.txt' saved [25872/25872]

 ---> 5228517c8641
Removing intermediate container 49c10e0057d5
Successfully built 5228517c8641

然后,您可以通过从刚构建的映像启动和输入容器来检查它是否真的有效:

docker run -i -t --rm test bash

然后,您可以在/ tmp中查找foo.txt.

我们现在可以添加任何文件到我们的图像,而不创建一个新的图层.假设你想添加一个大约5 GB的程序,如我们可以做的问题所述:

FROM debian:latest
RUN apt-get update -qq \
&& apt-get install -y wget
RUN cd /tmp \
&& wget http://conventiont:8000/program.zip \
&& unzip program.zip \
&& cd program \
&& make \
&& make install \
&& cd /tmp \
&& rm -f program.zip \
&& rm -rf program

以这种方式,我们不会留下10克的碎片.

原文链接:https://www.f2er.com/docker/436458.html

猜你在找的Docker相关文章