AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 899941
Accepted
Paul Dixon
Paul Dixon
Asked: 2018-03-05 13:41:00 +0800 CST2018-03-05 13:41:00 +0800 CST 2018-03-05 13:41:00 +0800 CST

Docker COPY/ADD 不再复制差异?

  • 772

很长一段时间以来,我使用 Docker 和一个中间容器构建了一个应用程序,例如,我将构建myapp:base一个复制了所有核心文件的应用程序:

FROM ubuntu:17.10
ADD app /app

myapp:release现在,可以简单地用这个创建主容器

 FROM myapp:base 
 ADD app /app

目录中可能会修改一些文件app,最后我会添加一个小的额外层。

不过最近,这个决赛ADD导致了一个更大的层,我怀疑它与 Docker 更新有关(我使用的是 Docker 版本 18.02.0-ce,构建 fc4de44)

Docker 找出不同之处的方式是否发生了变化?我怎样才能回到一个层中只有少量更新文件的高效构建?

重现步骤:

# make a dummy dir with a 64kb file in it

mkdir -p files
truncate -s 64k files/64k.file

# base container has a copy of the files

cat << EOF > Dockerfile.base
FROM ubuntu:16.04
COPY files/ /root/
EOF

# derived container should just have any updates

cat << EOF > Dockerfile.derived
FROM q899941:base
COPY files/ /root/
EOF

# build them....

docker build --file Dockerfile.base -t  q899941:base .
docker build --file Dockerfile.derived -t  q899941:derived .

# now let's review the layers

docker history q899941:derived

我得到这个结果

IMAGE               CREATED                  CREATED BY                                      SIZE  
4e1eb5168d55        Less than a second ago   /bin/sh -c #(nop) COPY dir:8e20ede288278c71e…   65.5kB
022626ac5cf0        Less than a second ago   /bin/sh -c #(nop) COPY dir:8e20ede288278c71e…   65.5kB
0458a4468cbc        5 weeks ago              /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B    
<missing>           5 weeks ago              /bin/sh -c mkdir -p /run/systemd && echo 'do…   7B    
<missing>           5 weeks ago              /bin/sh -c sed -i 's/^#\s*\(deb.*universe\)$…   2.76kB
<missing>           5 weeks ago              /bin/sh -c rm -rf /var/lib/apt/lists/*          0B    
<missing>           5 weeks ago              /bin/sh -c set -xe   && echo '#!/bin/sh' > /…   745B  
<missing>           5 weeks ago              /bin/sh -c #(nop) ADD file:a3344b835ea6fdc56…   112MB

即使没有文件更改,顶层也是 64kb。

docker
  • 1 1 个回答
  • 157 Views

1 个回答

  • Voted
  1. Best Answer
    Paul Dixon
    2018-03-06T13:15:52+08:002018-03-06T13:15:52+08:00

    似乎这是一个已知问题,但没有足够多的人关心!

    • 有没有办法只将更改的文件作为新层添加到 docker 映像中 - 而不诉诸 docker commit?是一个涵盖相同领域的 StackOverflow 问题。
    • 似乎我期望的行为适用于覆盖存储驱动程序,但在一些系统更新后,我开始使用 overlay2,它将所有文件复制到一个层中,而不仅仅是更改的文件
    • 虽然一种解决方案将恢复为覆盖,但此时它似乎已被强烈弃用。此处详细介绍了构建“差异”层的另一种方法

    我最终做了错误报告中的一个评论中提到的一件简单的事情:

    #clean up any previous attempt...
    
    docker rm -f uniquename 2> /dev/null
    
    # now take your base container, mount the updated dir as /src 
    # then rsync from /src to the target dir - only updated files will
    # actually be written, and we use --delete to ensure removed files are
    # taken out...
    
    docker run --name uniquename \
        -v ~/repo/mycode:/src \
        ${REPO}/${IMAGE}:${BASE} \
            rsync -ar --no-owner --no-group \
            --exclude-from '/src/.dockerignore' --delete \
            /src/ /app/
    
    # we can commit that updated container with a tag 
    
    docker commit uniquename ${REPO}/${IMAGE}:${NEW_TAG}
    

    还有一件事 - 这个解决方案似乎消除了CMD为我的容器提供默认启动命令的现有解决方案。因此,在添加了这个 diff 层之后,我有另一个 Dockerfile 来从上面的“diff”构建创建一个容器,并将CMD添加的内容重新添加进去。

    • 0

相关问题

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve