簡體   English   中英

如何禁用 docker 差異

[英]How to disable docker diff

以下是我機器的磁盤使用情況。 我跑了docker system df -v

CONTAINER ID   IMAGE               COMMAND   LOCAL VOLUMES   SIZE      CREATED             STATUS                  
a7ea593ae05e   c265fa50d720        "bash"    0               20.7GB    21 hours ago        Up 21 hours 

這會報告容器使用的正確存儲量。 這個容器創建了一個 19GB 的文件。
然而,
df -h 顯示以下磁盤空間消耗

Filesystem      Size  Used Avail Use% Mounted on
overlay          97G   72G   26G  75% /var/lib/docker/overlay2/aa15e95ad170e94462a8a2064b9f1bad62d3c2ea579f4e7ffcb16e159fbc1cea/merged

在檢查此文件夾時。 我發現/var/lib/docker/overlay2/9a58de48986643e6284123effe601e57099133ca55e471b548d059906b20434b文件夾消耗了 42 GB。 檢查此文件夾的磁盤使用統計信息

20G /var/lib/docker/overlay2/9a58de48986643e6284123effe601e57099133ca55e471b548d059906b20434b/diff
23G /var/lib/docker/overlay2/9a58de48986643e6284123effe601e57099133ca55e471b548d059906b20434b/merged
42G /var/lib/docker/overlay2/9a58de48986643e6284123effe601e57099133ca55e471b548d059906b20434b

在進一步檢查中,我可以在合並目錄和 diff 目錄中找到 20 GB 的文件。 這就解釋了為什么它消耗了兩倍的存儲量。

我從未在生產實例上運行docker diff 所以這對我造成的傷害大於好處。 我想知道是否有可能禁用 docker 為某些特定文件夾運行差異,以便不存儲實例創建的文件的冗余副本?

請在下面找到創建最小可重現示例的步驟

Docker文件

FROM ubuntu:18.04

RUN apt update -y
RUN apt upgrade -y

RUN apt-get install -y python3 python3-dev
RUN apt-get install -y python3-pip jq

RUN mkdir -p /opt/program/

WORKDIR "/opt/program/"
ADD ./ /opt/program/
CMD  ["bash", "-c", "python3 -u program.py"]

程序.py

import logging
import time
import argparse
import random

logging.basicConfig(level=logging.DEBUG)

if __name__ == "__main__":
    # parser = argparse.ArgumentParser()
    # parser.add_argument('--test')
    # args = parser.parse_args()
    l = ['test_' + str(i) for i in range(1000000)]
    with open('/tmp/test_abc123', 'w') as f:
        f.write('\n'.join(l))
    while 1:
         
        time.sleep(1)
        logging.info("%s", 'test')


我執行了以下命令

1. sudo docker build -f Dockerfile .
2. sudo docker run -d <image_id>
3. sudo docker container exec -it <container_id> bash
4. Verified a 11 MB file is created in /tmp in the container. 
5. Now, I search for the file in my host machine

satinders:/var/lib/docker/overlay2# ls -l $(find . -iname test_abc123)
-rw-r--r-- 1 root root 11888889 Jan 11 18:03 ./edf8615137c5b04e14116f6285757d4db170187282a5b51d78f4f77ca4c9b707/diff/tmp/test_abc123
-rw-r--r-- 1 root root 11888889 Jan 11 18:03 ./edf8615137c5b04e14116f6285757d4db170187282a5b51d78f4f77ca4c9b707/merged/tmp/test_abc123

更新

我在 docker diff文檔中找到了這個

列出自容器創建以來容器文件系統中更改的文件和目錄。 跟蹤三種不同類型的變化:

A   A file or directory was added
D   A file or directory was deleted
C   A file or directory was changed

merged是一個覆蓋文件系統,它是文件系統層的組合,它本身不占用實際的磁盤空間(類似於綁定掛載的行為)。 diff目錄是在該層或容器讀寫層中創建的更改(對於合並目錄,我相信它被跟蹤為上層目錄)。 因此,文件是在該層中創建或修改的,並且在該層中存儲一次。

如果文件也在較低層中(例如在圖像和容器特定層中),那么您可能已經修改了文件,觸發了寫入時的復制。 該更改可以包括對文件的權限或所有權更改。

要禁用容器差異和讀寫層,您可以使用--read-only標志定義容器。 您將無法在容器中創建不在其他掛載(卷或 tmpfs)中的文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM