<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 使用 BuildKit 構建鏡像 **BuildKit** 是下一代的鏡像構建組件,在 [https://github.com/moby/buildkit](https://github.com/moby/buildkit) 開源。 **注意:如果您的鏡像構建使用的是云服務商提供的鏡像構建服務(Docker Hub 自動構建、騰訊云容器服務、阿里云容器服務等),由于上述服務提供商的 Docker 版本低于 18.09,BuildKit 無法使用,將造成鏡像構建失敗。建議使用 BuildKit 構建鏡像時使用一個新的 Dockerfile 文件(例如 Dockerfile.buildkit)** **注意:docker-compose build 命令暫時不支持 BuildKit** 下面介紹如何在 Docker CE 18.09+ 版本中使用 `BuildKit` 提供的 `Dockerfile` 新指令來更快、更安全的構建 Docker 鏡像。 ## 啟用 `BuildKit` 啟用 `BuildKit` 必須先設置 **環境變量**。 Linux、macOS 執行如下命令: ```bash $ export DOCKER_BUILDKIT=1 ``` Windows 執行如下命令: ```text $ set $env:DOCKER_BUILDKIT=1 ``` > 以上是設置環境變量的臨時方法,若使環境變量永久生效請讀者自行設置。 ## `Dockerfile` 新增指令詳解 啟用 `BuildKit` 之后,我們可以使用下面幾個新的指令來加快鏡像構建。 ### `RUN --mount=type=cache` 目前,幾乎所有的程序都會使用依賴管理工具,例如 `Go` 中的 `go mod`、`Node.js` 中的 `npm` 等等,當我們構建一個鏡像時,往往會重復的從互聯網中獲取依賴包,難以緩存,大大降低了鏡像的構建效率。 例如一個前端工程需要用到 `npm`: ```text FROM node:alpine as builder WORKDIR /app COPY package.json /app/ RUN npm i --registry=https://registry.npm.taobao.org \ && rm -rf ~/.npm COPY src /app/src RUN npm run build FROM nginx:alpine COPY --from=builder /app/dist /app/dist ``` 使用多階段構建,構建的鏡像中只包含了目標文件夾 `dist`,但仍然存在一些問題,當 `package.json` 文件變動時,`RUN npm i && rm -rf ~/.npm` 這一層會重新執行,變更多次后,生成了大量的中間層鏡像。 為解決這個問題,進一步的我們可以設想一個類似 **數據卷** 的功能,在鏡像構建時把 `node_modules` 文件夾掛載上去,在構建完成后,這個 `node_modules` 文件夾會自動卸載,實際的鏡像中并不包含 `node_modules` 這個文件夾,這樣我們就省去了每次獲取依賴的時間,大大增加了鏡像構建效率,同時也避免了生成了大量的中間層鏡像。 `BuildKit` 提供了 `RUN --mount=type=cache` 指令,可以實現上邊的設想。 ```text # syntax = docker/dockerfile:experimental FROM node:alpine as builder WORKDIR /app COPY package.json /app/ RUN --mount=type=cache,target=/app/node_modules,id=my_app_npm_module,sharing=locked \ --mount=type=cache,target=/root/.npm,id=npm_cache \ npm i --registry=https://registry.npm.taobao.org COPY src /app/src RUN --mount=type=cache,target=/app/node_modules,id=my_app_npm_module,sharing=locked \ # --mount=type=cache,target=/app/dist,id=my_app_dist,sharing=locked \ npm run build FROM nginx:alpine # COPY --from=builder /app/dist /app/dist # 為了更直觀的說明 from 和 source 指令,這里使用 RUN 指令 RUN --mount=type=cache,target=/tmp/dist,from=builder,source=/app/dist \ # --mount=type=cache,target/tmp/dist,from=my_app_dist,sharing=locked \ mkdir -p /app/dist && cp -r /tmp/dist/* /app/dist ``` **由于 `BuildKit` 為實驗特性,每個 `Dockerfile` 文件開頭都必須加上如下指令** ```text # syntax = docker/dockerfile:experimental ``` 第一個 `RUN` 指令執行后,`id` 為 `my_app_npm_module` 的緩存文件夾掛載到了 `/app/node_modules` 文件夾中。多次執行也不會產生多個中間層鏡像。 第二個 `RUN` 指令執行時需要用到 `node_modules` 文件夾,`node_modules` 已經掛載,命令也可以正確執行。 第三個 `RUN` 指令將上一階段產生的文件復制到指定位置,`from` 指明緩存的來源,這里 `builder` 表示緩存來源于構建的第一階段,`source` 指明緩存來源的文件夾。 上面的 `Dockerfile` 中 `--mount=type=cache,...` 中指令作用如下: | Option | Description | | :--- | :--- | | `id` | `id` 設置一個標志,以便區分緩存。 | | `target` \(必填項\) | 緩存的掛載目標文件夾。 | | `ro`,`readonly` | 只讀,緩存文件夾不能被寫入。 | | `sharing` | 有 `shared` `private` `locked` 值可供選擇。`sharing` 設置當一個緩存被多次使用時的表現,由于 `BuildKit` 支持并行構建,當多個步驟使用同一緩存時(同一 `id`)會發生沖突。`shared` 表示多個步驟可以同時讀寫,`private` 表示當多個步驟使用同一緩存時,每個步驟使用不同的緩存,`locked` 表示當一個步驟完成釋放緩存后,后一個步驟才能繼續使用該緩存。 | | `from` | 緩存來源(構建階段),不填寫時為空文件夾。 | | `source` | 來源的文件夾路徑。 | ### `RUN --mount=type=bind` 該指令可以將一個鏡像(或上一構建階段)的文件掛載到指定位置。 ```text # syntax = docker/dockerfile:experimental RUN --mount=type=bind,from=php:alpine,source=/usr/local/bin/docker-php-entrypoint,target=/docker-php-entrypoint \ cat /docker-php-entrypoint ``` ### `RUN --mount=type=tmpfs` 該指令可以將一個 `tmpfs` 文件系統掛載到指定位置。 ```text # syntax = docker/dockerfile:experimental RUN --mount=type=tmpfs,target=/temp \ mount | grep /temp ``` ### `RUN --mount=type=secret` 該指令可以將一個文件掛載到指定位置。 ```text # syntax = docker/dockerfile:experimental RUN --mount=type=secret,id=aws,target=/root/.aws/credentials \ cat /root/.aws/credentials ``` ```bash $ docker build -t test --secret id=aws,src=$HOME/.aws/credentials . ``` ### `RUN --mount=type=ssh` 該指令可以掛載 `ssh` 密鑰。 ```text # syntax = docker/dockerfile:experimental FROM alpine RUN apk add --no-cache openssh-client RUN mkdir -p -m 0700 ~/.ssh && ssh-keyscan gitlab.com >> ~/.ssh/known_hosts RUN --mount=type=ssh ssh git@gitlab.com | tee /hello ``` ```bash $ eval $(ssh-agent) $ ssh-add ~/.ssh/id_rsa (Input your passphrase here) $ docker build -t test --ssh default=$SSH_AUTH_SOCK . ``` ## 清理構建緩存 執行以下命令清理構建緩存 ```bash $ docker builder prune ``` ## 官方文檔 * [https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md](https://github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/experimental.md)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看