<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>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                ### ONBUILD 為他人做嫁衣裳 格式:`ONBUILD <其它指令>`。 `ONBUILD` 是一個特殊的指令,它后面跟的是其它指令,比如 `RUN`, `COPY` 等,而這些指令,在當前鏡像構建時并不會被執行。只有當以當前鏡像為基礎鏡像,去構建下一級鏡像的時候才會被執行。 `Dockerfile` 中的其它指令都是為了定制當前鏡像而準備的,唯有 `ONBUILD` 是為了幫助別人定制自己而準備的。 假設我們要制作 Node.js 所寫的應用的鏡像。我們都知道 Node.js 使用 `npm` 進行包管理,所有依賴、配置、啟動信息等會放到 `package.json` 文件里。在拿到程序代碼后,需要先進行 `npm install` 才可以獲得所有需要的依賴。然后就可以通過 `npm start` 來啟動應用。因此,一般來說會這樣寫 `Dockerfile`: ```Dockerfile FROM node:slim RUN mkdir /app WORKDIR /app COPY ./package.json /app RUN [ "npm", "install" ] COPY . /app/ CMD [ "npm", "start" ] ``` 把這個 `Dockerfile` 放到 Node.js 項目的根目錄,構建好鏡像后,就可以直接拿來啟動容器運行。但是如果我們還有第二個 Node.js 項目也差不多呢?好吧,那就再把這個 `Dockerfile` 復制到第二個項目里。那如果有第三個項目呢?再復制么?文件的副本越多,版本控制就越困難,讓我們繼續看這樣的場景維護的問題。 如果第一個 Node.js 項目在開發過程中,發現這個 `Dockerfile` 里存在問題,比如敲錯字了、或者需要安裝額外的包,然后開發人員修復了這個 `Dockerfile`,再次構建,問題解決。第一個項目沒問題了,但是第二個項目呢?雖然最初 `Dockerfile` 是復制、粘貼自第一個項目的,但是并不會因為第一個項目修復了他們的 `Dockerfile`,而第二個項目的 `Dockerfile` 就會被自動修復。 那么我們可不可以做一個基礎鏡像,然后各個項目使用這個基礎鏡像呢?這樣基礎鏡像更新,各個項目不用同步 `Dockerfile` 的變化,重新構建后就繼承了基礎鏡像的更新?好吧,可以,讓我們看看這樣的結果。那么上面的這個 `Dockerfile` 就會變為: ```Dockerfile FROM node:slim RUN mkdir /app WORKDIR /app CMD [ "npm", "start" ] ``` 這里我們把項目相關的構建指令拿出來,放到子項目里去。假設這個基礎鏡像的名字為 `my-node` 的話,各個項目內的自己的 `Dockerfile` 就變為: ```Dockerfile FROM my-node COPY ./package.json /app RUN [ "npm", "install" ] COPY . /app/ ``` 基礎鏡像變化后,各個項目都用這個 `Dockerfile` 重新構建鏡像,會繼承基礎鏡像的更新。 那么,問題解決了么?沒有。準確說,只解決了一半。如果這個 `Dockerfile` 里面有些東西需要調整呢?比如 `npm install` 都需要加一些參數,那怎么辦?這一行 `RUN` 是不可能放入基礎鏡像的,因為涉及到了當前項目的 `./package.json`,難道又要一個個修改么?所以說,這樣制作基礎鏡像,只解決了原來的 `Dockerfile` 的前4條指令的變化問題,而后面三條指令的變化則完全沒辦法處理。 `ONBUILD` 可以解決這個問題。讓我們用 `ONBUILD` 重新寫一下基礎鏡像的 `Dockerfile`: ```Dockerfile FROM node:slim RUN mkdir /app WORKDIR /app ONBUILD COPY ./package.json /app ONBUILD RUN [ "npm", "install" ] ONBUILD COPY . /app/ CMD [ "npm", "start" ] ``` 這次我們回到原始的 `Dockerfile`,但是這次將項目相關的指令加上 `ONBUILD`,這樣在構建基礎鏡像的時候,這三行并不會被執行。然后各個項目的 `Dockerfile` 就變成了簡單地: ```Dockerfile FROM my-node ``` 是的,只有這么一行。當在各個項目目錄中,用這個只有一行的 `Dockerfile` 構建鏡像時,之前基礎鏡像的那三行 `ONBUILD` 就會開始執行,成功的將當前項目的代碼復制進鏡像、并且針對本項目執行 `npm install`,生成應用鏡像。
                  <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>

                              哎呀哎呀视频在线观看