添加和复制以将目录的内容与已在构建中的内容合并

时间:2017-06-13 19:21:07

标签: docker dockerfile

我正在尝试使用与dockerfile一起存储的一些文件来组合图像。我对COPY或ADD的期望是合并行为。但是,如果我使用这些指令,则会覆盖文件层次结构。因此,如果父图像中的文件位于路径中,则它们将不再可用。 (如果我要在/ etc / mycoolstuff / filehere上保存一些文件,则会出现巨大问题)

当发生这种情况时,我无法再使用apt-get

我也看到一些建议将我的文件转换为tar打包,但没有观察到任何不同。

为清楚起见,这是其中一个问题(如果我改变顺序,则会构建,但无论如何都会因为子图像无法再使用apt而终止):

ADD     build/image-base.tgz /
RUN     apt-get clean -y && \
            apt-get update && \
            apt-get install unzip -y --no-install-recommends && \
            apt-get install gosu -y --no-install-recommends && \
            apt-get clean -y && \
            apt-get autoclean -y && \
            apt-get autoremove -y && \
            rm -rf /var/lib/apt/lists/*

Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial/InRelease Temporary failure resolving 'archive.ubuntu.com'
Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-updates/InRelease Temporary failure resolving 'archive.ubuntu.com'
Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-backports/InRelease Temporary failure resolving 'archive.ubuntu.com'
Failed to fetch http://security.ubuntu.com/ubuntu/dists/xenial-security/InRelease Temporary failure resolving 'security.ubuntu.com'
Failed to fetch http://ppa.launchpad.net/webupd8team/java/ubuntu/dists/xenial/InRelease 
Temporary failure resolving 'ppa.launchpad.net'
Some index files failed to download. They have been ignored, or old ones used instead.

4 个答案:

答案 0 :(得分:3)

你想要达到什么目的?你真的想覆盖根目录吗?然后,您最好从 scratch 构建图像。为此,您的Dockerfile必须以FROM scratch

开头

关于该主题的官方Docker教程,包含多个发行版的脚本:

https://docs.docker.com/engine/userguide/eng-image/baseimages/

答案 1 :(得分:1)

经过一番挖掘后,我找到了COPY和RUN的解决方法,以实现我正在寻找的行为。

COPY    build/image-base.tgz /

RUN     tar -xvf image-base.tgz --no-overwrite-dir 

不幸的是,这会创建一个新图层,基本tar将保留在那里。如果只是一些文本配置文件,这不是一个小问题。

绕过COPY指令的一种奇怪的方法是使用wget,然后解压缩,因此我们可以删除tar文件。如果我们在一个构建环境中存储工件并为它们创建URL,那么wget将会发挥作用......在这种情况下,我们只需要一次运行,保持房屋清洁。

答案 2 :(得分:1)

Docker从17.05开始具有多阶段构建:Use multi-stage builds

FROM busybox as builder
ADD build/image-base.tgz /tmproot/

FROM alpine:latest  
...
COPY --from=builder /tmproot /
...

另一个例子:

FROM busybox as builder
COPY src/etc/app /tmproot/etc/app
COPY src/app /tmproot/usr/local/app

FROM alpine:latest  
...
COPY --from=builder /tmproot /
...

答案 3 :(得分:0)

我正在使用Azure DevOps Pipelines(Windows代理)以及Docker Desktop for Windows,并且发现自动合并。也许您应该更新Docker版本或重试合并是否确实按期望进行。