我正在尝试使用与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.
答案 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版本或重试合并是否确实按期望进行。