gpt4 book ai didi

git - 如何让 git clone 与 Docker 缓存一起玩?

转载 作者:行者123 更新时间:2023-12-04 11:36:52 31 4
gpt4 key购买 nike

当我克隆一个存储库两次时,例如:

git clone <repo_X> --depth 1 clone1
git clone <repo_X> --depth 1 clone2

然后做一个差异
diff -r clone1 clone2

这显示了差异:
Binary files clone1/.git/index and clone2/.git/index differ
...
diff -r clone1/.git/logs/HEAD clone2/.git/logs/HEAD
...
diff -r clone1/.git/logs/refs/remotes/origin/HEAD
...

似乎克隆的时间被记录在一个文件中。

我想向 Docker 镜像添加一些存储库。当文件未更改时,Docker 使用其缓存。不幸的是,在克隆 Docker 之后,由于文件更改,总是使缓存无效。
  • 是否有可能让一个 repo 的两个克隆产生完全相同的文件? (注意:我不想删除 .git 目录,因为我希望能够在图像中使用 git 来检查存储库的版本。)
  • 是否可以让 Docker 在缓存时忽略 .git 文件夹(注意 .git 文件夹仍然必须添加到图像中,所以 .dockerignore 不是一个选项?)
  • 最佳答案

    您可以使用新的 Docker 的 BuildKit 功能 --mount=cache . Dockerfile 的玩具示例:

    FROM ubuntu
    RUN --mount=type=cache,target=/var/cache/apt \
    apt update && apt upgrade -y && apt install -yq git
    RUN echo A00
    RUN --mount=type=cache,target=/tmp/git_cache/ \
    git clone --depth=1 https://github.com/qtox/qtox/ /tmp/git_cache/qtox/; \
    cd /tmp/git_cache/qtox/ && git pull && cp -r ./ /tmp/my_qtox/
    RUN echo B00
    以上 dockerfile 可以通过命令构建: sudo env DOCKER_BUILDKIT=1 docker build -f Dockerfile .通知 DOCKER_BUILDKIT=1 的存在环境变量,有必要在 docker build 中启用所有 BuildKit 的功能。您可以阅读 BuildKit 的功能 here .
    例如我克隆了 qTox上面的 repo ,因为它非常大。 --mount=cache功能会自动创建用于缓存的临时目录并将其挂载到 /tmp/git_cache/ (目标)在容器内。如果之前的一些图层发生了变化,例如 echo A00改为 echo A01然后这个克隆立即完成,没有延迟,因为它只是从缓存中取出。
    此外,正如您要求使用此缓存将使克隆存储库完全相同。只有当新提交出现在存储库中时, git pull完成并更改存储库。除非有新的提交,否则这个缓存的存储库将保持不变。因此,每次再次运行 docker build 时,您都会拥有相同的 git repo。
    如果长时间不使用或磁盘可用空间不足,Docker 很少会自动删除缓存目录。
    正如您从上面的 docker-file 中看到的,最终的 git repo 将出现在 /tmp/my_qtox/ 中容器的文件夹。您可以将此路径更改为您的案例所需的任何内容。
    您也可能已经注意到,我在安装 APT 包时使用了相同的缓存机制。这非常方便,因为在重建镜像时,所有软件包都不会从远程 Ubuntu 服务器重新下载,而是从缓存目录中获取。当 apt install 之前的先前 docker 层发生更改或将新的 apt 包添加到安装列表时,这很有用,在这两种情况下 apt install 都会非常快地重新运行。

    关于git - 如何让 git clone 与 Docker 缓存一起玩?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55003297/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com