加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 03:33:08 所属栏目:安全 来源:网络整理
导读:为了编译程序,我需要在Docker容器中的一个大的* .zip文件(5GB)的内容. * .zip文件位于我的本地机器上.这样做的策略是: COPY program.zip /tmp/RUN cd /tmp unzip program.zip make 完成之后,我想删除解压缩的目录和原始的* .zip文件,因为它们不再需要了

为了编译程序,我需要在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克的碎片.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读