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

lor*_*age 16 docker

我需要容器中的大*.zip文件(5 gb)的内容Docker才能编译程序.该*.zip文件驻留在我的本地计算机上.对此的策略是:

COPY program.zip /tmp/
RUN cd /tmp \
&& unzip program.zip \
&& make
Run Code Online (Sandbox Code Playgroud)

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

lor*_*age 18

这不是直截了当的,但可以通过wgetcurl稍微支持来完成python.(通常应该在*nix系统上提供所有这三种工具.)

wget当没有url给出时,它将无法工作

 curl file://localhost/home/user/program.zip -o /tmp/
Run Code Online (Sandbox Code Playgroud)

不会从内工作DockerfileRUN指令.因此,我们将需要其中的服务器wget,并curl可以访问并下载program.zip而来.

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

python -m http.server --bind 192.168.178.20 8000
Run Code Online (Sandbox Code Playgroud)

python服务器将提供所有文件是在启动目录.所以,你应该确保你启动服务器无论是在你想你的图像生成过程中下载的文件所在的目录或创建一个包含你的程序的临时目录.为了便于说明,让我们创建的文件foo.txt,我们将在以后通过下载wget我们Dockerfile:

echo "foo bar" > foo.txt
Run Code Online (Sandbox Code Playgroud)

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

python3 -m http.server --bind 192.168.178.20 8000
Serving HTTP on 192.168.178.20 port 8000 ...
Run Code Online (Sandbox Code Playgroud)

现在我们构建一个Dockerfile来说明它是如何工作的.(我们假设该文件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
Run Code Online (Sandbox Code Playgroud)

现在我们开始构建

docker build -t test .
Run Code Online (Sandbox Code Playgroud)

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

172.17.0.21 - - [01/Nov/2014 23:32:37] "GET /foo.txt HTTP/1.1" 200 -
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

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

docker run -i -t --rm test bash
Run Code Online (Sandbox Code Playgroud)

那么你可以看看在/tmpfoo.txt.

我们现在可以在image不创建新图层的情况下向我们添加任何文件.假设您要添加一个大约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
Run Code Online (Sandbox Code Playgroud)

通过这种方式,我们不会留下10 gb的残余.