Docker BuildKit 带有 --mount=type=cache 和安装的纱线缓存似乎总是空的?

use*_*125 5 docker yarnpkg

当包依赖项发生变化时,我试图加快我的纱线安装类型。我试图重现这个问题的核心。

package.json(随机包,示例)

{
  "name": "docker-cache",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "colors": "^1.4.0",
    "deep-equal": "2.0.3",
    "dotenv": "8.2.0",
    "eslint": "^7.14.0",
    "eslint-config-prettier": "^6.15.0",
    "eslint-config-react-app": "^6.0.0",
    "eslint-loader": "^4.0.2",
    "eslint-plugin-filenames": "^1.3.2",
    "eslint-plugin-flowtype": "^5.2.0",
    "eslint-plugin-import": "^2.22.1",
    "eslint-plugin-jsx-a11y": "^6.4.1",
    "eslint-plugin-react": "^7.21.5",
    "eslint-plugin-react-hooks": "^4.2.0",
    "exceljs": "^4.2.1",
    "fast-check": "^1.24.2",
    "file-loader": "6.0.0",
    "find": "0.3.0",
    "fs-extra": "9.0.1",
    "html-webpack-plugin": "4.3.0",
    "jest": "26.2.2",
    "jest-canvas-mock": "2.2.0",
    "jest-pnp-resolver": "^1.2.1",
    "json-diff": "0.5.4",
    "lerna": "^3.22.1",
    "madge": "^5.0.1",
    "mini-css-extract-plugin": "0.9.0",
    "mobx-logger": "^0.7.1",
    "mutationobserver-shim": "^0.3.7",
    "node-fetch": "^2.2.1",
    "nodemon": "^2.0.4",
    "object-hash": "2.0.3",
    "optimize-css-assets-webpack-plugin": "5.0.3",
    "pdfjs-dist": "^2.5.207",
    "pdfreader": "^1.2.6",
    "pnp-webpack-plugin": "^1.6.4",
    "postcss": "^8.3.11",
    "postcss-flexbugs-fixes": "^5.0.2",
    "postcss-loader": "^4.0.0",
    "postcss-normalize": "^10.0.1",
    "postcss-preset-env": "^6.7.0",
    "postcss-safe-parser": "^6.0.0",
    "prettier": "2.0.5",
    "q": "^1.5.1",
    "react-dev-utils": "^11.0.4",
    "react-error-overlay": "6.0.7",
    "react-test-renderer": "16.12.0",
    "rimraf": "^3.0.2"
  }
}
Run Code Online (Sandbox Code Playgroud)

Dockerfile

FROM node:16.13.0
WORKDIR /tmp/
COPY package.json yarn.lock ./

ENV YARN_CACHE_FOLDER=/root/.yarn
RUN yarn config set cache-folder $YARN_CACHE_FOLDER # just to be explicit
RUN --mount=type=cache,mode=0777,target=$YARN_CACHE_FOLDER yarn cache list
RUN --mount=type=cache,mode=0777,target=$YARN_CACHE_FOLDER YARN_CACHE_FOLDER=$YARN_CACHE_FOLDER yarn install --network-timeout=600000 --frozen-lockfile

CMD ["echo ", "Done"]
Run Code Online (Sandbox Code Playgroud)

现在我跑docker buildx build --progress=plain --no-cache -t attempt-1 .

第一遍的输出

#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 32B done
#1 DONE 0.0s

#2 [internal] load .dockerignore
#2 transferring context: 2B done
#2 DONE 0.0s

#3 [internal] load metadata for docker.io/library/node:16.13.0
#3 DONE 0.2s

#4 [stage-0 1/6] FROM docker.io/library/node:16.13.0@sha256:580a0850049c59a48f06090edd48c9f966c5e6572bbbabc369ba3ecbc4855dba
#4 DONE 0.0s

#5 [internal] settings cache mount permissions
#5 CACHED

#6 [stage-0 2/6] WORKDIR /tmp/
#6 CACHED

#7 [internal] load build context
#7 transferring context: 509.56kB 0.0s done
#7 DONE 0.0s

#8 [stage-0 3/6] COPY package.json yarn.lock ./
#8 DONE 0.1s

#9 [stage-0 4/6] RUN yarn config set cache-folder /root/.yarn
#9 0.598 yarn config v1.22.15
#9 0.620 success Set "cache-folder" to "/root/.yarn".
#9 0.620 Done in 0.03s.
#9 DONE 0.8s

#10 [stage-0 5/6] RUN --mount=type=cache,mode=0777,target=/root/.yarn yarn cache list
#10 0.370 yarn cache v1.22.15
#10 0.403 Name Version Registry Resolved
#10 0.403 Done in 0.04s.
#10 DONE 0.7s

#11 [stage-0 6/6] RUN --mount=type=cache,mode=0777,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn install --network-timeout=600000 --frozen-lockfile
#11 0.579 yarn install v1.22.15
#11 0.673 [1/4] Resolving packages...
#11 1.081 [2/4] Fetching packages...
#11 28.26 info fsevents@2.3.2: The platform "linux" is incompatible with this module.
#11 28.26 info "fsevents@2.3.2" is an optional dependency and failed compatibility check. Excluding it from installation.
#11 28.28 [3/4] Linking dependencies...
#11 28.28 warning " > eslint-config-react-app@6.0.0" has unmet peer dependency "@typescript-eslint/eslint-plugin@^4.0.0".
#11 28.28 warning " > eslint-config-react-app@6.0.0" has unmet peer dependency "@typescript-eslint/parser@^4.0.0".
#11 28.28 warning " > eslint-config-react-app@6.0.0" has unmet peer dependency "babel-eslint@^10.0.0".
#11 28.28 warning " > eslint-loader@4.0.2" has unmet peer dependency "webpack@^4.0.0 || ^5.0.0".
#11 28.29 warning " > file-loader@6.0.0" has unmet peer dependency "webpack@^4.0.0 || ^5.0.0".
#11 28.29 warning " > html-webpack-plugin@4.3.0" has unmet peer dependency "webpack@>=4.0.0 < 6.0.0".
#11 28.29 warning "lerna > @lerna/version > @lerna/github-client > @octokit/rest > @octokit/plugin-request-log@1.0.4" has unmet peer dependency "@octokit/core@>=3".
#11 28.29 warning " > mini-css-extract-plugin@0.9.0" has unmet peer dependency "webpack@^4.4.0".
#11 28.29 warning " > mobx-logger@0.7.1" has unmet peer dependency "mobx@>= 4.0.0".
#11 28.29 warning " > optimize-css-assets-webpack-plugin@5.0.3" has unmet peer dependency "webpack@^4.0.0".
#11 28.29 warning " > postcss-loader@4.3.0" has unmet peer dependency "webpack@^4.0.0 || ^5.0.0".
#11 28.29 warning " > postcss-normalize@10.0.1" has unmet peer dependency "browserslist@>= 4".
#11 28.29 warning "postcss-normalize > postcss-browser-comments@4.0.0" has unmet peer dependency "browserslist@>=4".
#11 28.29 warning " > react-test-renderer@16.12.0" has unmet peer dependency "react@^16.0.0".
#11 44.69 [4/4] Building fresh packages...
#11 45.52 Done in 44.95s.
#11 DONE 46.0s

#12 exporting to image
#12 exporting layers
#12 exporting layers 10.5s done
#12 writing image sha256:5866fab165e759bd4c57c48f85856d98dc2bfa778e1f549a39b36289c8749bbb done
#12 naming to docker.io/library/attempt-1 done
#12 DONE 10.5s
Run Code Online (Sandbox Code Playgroud)

接下来,我删除了该colors包,运行yarn(以更新yarn.lock)并重新运行docker buildx。

第二遍输出

#1 [internal] load build definition from Dockerfile
#1 transferring dockerfile: 32B done
#1 DONE 0.0s

#2 [internal] load .dockerignore
#2 transferring context: 2B done
#2 DONE 0.0s

#3 [internal] load metadata for docker.io/library/node:16.13.0
#3 DONE 0.5s

#4 [stage-0 1/6] FROM docker.io/library/node:16.13.0@sha256:580a0850049c59a48f06090edd48c9f966c5e6572bbbabc369ba3ecbc4855dba
#4 DONE 0.0s

#5 [internal] settings cache mount permissions
#5 CACHED

#6 [stage-0 2/6] WORKDIR /tmp/
#6 CACHED

#7 [internal] load build context
#7 transferring context: 511.02kB 0.0s done
#7 DONE 0.0s

#8 [stage-0 3/6] COPY package.json yarn.lock ./
#8 DONE 0.0s

#9 [stage-0 4/6] RUN yarn config set cache-folder /root/.yarn
#9 0.341 yarn config v1.22.15
#9 0.372 success Set "cache-folder" to "/root/.yarn".
#9 0.372 Done in 0.04s.
#9 DONE 0.4s

#10 [stage-0 5/6] RUN --mount=type=cache,mode=0777,target=/root/.yarn yarn cache list
#10 0.338 yarn cache v1.22.15
#10 0.368 Name Version Registry Resolved
#10 0.369 Done in 0.03s.
#10 DONE 0.4s

#11 [stage-0 6/6] RUN --mount=type=cache,mode=0777,target=/root/.yarn YARN_CACHE_FOLDER=/root/.yarn yarn install --network-timeout=600000 --frozen-lockfile
#11 0.473 yarn install v1.22.15
#11 0.544 [1/4] Resolving packages...
#11 0.949 [2/4] Fetching packages...
#11 27.43 info fsevents@2.3.2: The platform "linux" is incompatible with this module.
#11 27.43 info "fsevents@2.3.2" is an optional dependency and failed compatibility check. Excluding it from installation.
#11 27.45 [3/4] Linking dependencies...
#11 27.46 warning " > eslint-config-react-app@6.0.0" has unmet peer dependency "@typescript-eslint/eslint-plugin@^4.0.0".
#11 27.46 warning " > eslint-config-react-app@6.0.0" has unmet peer dependency "@typescript-eslint/parser@^4.0.0".
#11 27.46 warning " > eslint-config-react-app@6.0.0" has unmet peer dependency "babel-eslint@^10.0.0".
#11 27.46 warning " > eslint-loader@4.0.2" has unmet peer dependency "webpack@^4.0.0 || ^5.0.0".
#11 27.46 warning " > file-loader@6.0.0" has unmet peer dependency "webpack@^4.0.0 || ^5.0.0".
#11 27.46 warning " > html-webpack-plugin@4.3.0" has unmet peer dependency "webpack@>=4.0.0 < 6.0.0".
#11 27.46 warning "lerna > @lerna/version > @lerna/github-client > @octokit/rest > @octokit/plugin-request-log@1.0.4" has unmet peer dependency "@octokit/core@>=3".
#11 27.46 warning " > mini-css-extract-plugin@0.9.0" has unmet peer dependency "webpack@^4.4.0".
#11 27.46 warning " > mobx-logger@0.7.1" has unmet peer dependency "mobx@>= 4.0.0".
#11 27.46 warning " > optimize-css-assets-webpack-plugin@5.0.3" has unmet peer dependency "webpack@^4.0.0".
#11 27.46 warning " > postcss-loader@4.3.0" has unmet peer dependency "webpack@^4.0.0 || ^5.0.0".
#11 27.46 warning " > postcss-normalize@10.0.1" has unmet peer dependency "browserslist@>= 4".
#11 27.46 warning "postcss-normalize > postcss-browser-comments@4.0.0" has unmet peer dependency "browserslist@>=4".
#11 27.46 warning " > react-test-renderer@16.12.0" has unmet peer dependency "react@^16.0.0".
#11 40.10 [4/4] Building fresh packages...
#11 40.82 Done in 40.35s.
#11 DONE 41.1s

#12 exporting to image
#12 exporting layers
#12 exporting layers 11.8s done
#12 writing image sha256:668320ce0930ff1174cdc14ec5cdc35f4de94e328b04a745ba41ec48643b074c done
#12 naming to docker.io/library/attempt-1 done
#12 DONE 11.8s
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,第二遍看起来与第一遍非常相似。结果yarn cache list仍然是空的,大约需要 40-46 秒才能完成,表明没有进行缓存。

节目输出docker system df -v

hwtq1k2pkn4u exec.cachemount 0B 17 minutes ago 17 seconds ago 14 false

所以它肯定是在存储它......但它只是空的。我在 macOS 上。