多階段構建無法從上一階段複製檔案

2021-10-18 19:23:28 字數 2033 閱讀 2184

from node:alpine as build

run npm

install

cmd [

"npm","run","build"

]from nginx:alpine

$ docker build -t foo .

...

有什麼問題,我該如何解決?檢視了很多文章,最終得到解決

問題是第一步的最後一步

cmd [

"npm","run","build"

]

應該

run npm run build
檢視cmd和run之間的區別。

dockerfile run,cmd,entrypoint命令區別

shell格式和exec格式執行命令

我們可用兩種方式指定 run、cmd 和 entrypoint 要執行的命令:shell 格式和 exec 格式:

cmd 和 entrypoint 推薦使用 exec 格式,因為指令可讀性更強,更容易理解。run 則兩種格式都可以

run 指令通常用於安裝應用和軟體包。run 在當前映象的頂部執行命令,並通過建立新的映象層。dockerfile 中常常包含多個 run 指令。下面是乙個例子:

run apt-get update &&

apt-get

install -y \

bzr \

cvs \

git \

mercurial \

subversion

apt-get update 和 apt-get install 被放在乙個 run 指令中執行,這樣能夠保證每次安裝的是最新的包。如果apt-get install 在單獨的 run 中執行,則會使用 apt-get update 建立的映象層,而這一層可能是很久以前快取的

cmd 指令允許使用者指定容器的預設執行的命令。此命令會在容器啟動且docker run 沒有指定其他命令時執行。下面是乙個例子:

cmd echo

"hello world"

執行容器 docker run -it [image] 將輸出:

hello world
root@10a32dc7d3d3:/#
entrypoint 的 exec 格式用於設定容器啟動時要執行的命令及其引數,同時可通過cmd命令或者命令列引數提供額外的引數。entrypoint 中的引數始終會被使用,這是與cmd命令不同的一點。下面是乙個例子:

entrypoint [

"/bin/echo", "hello"

]

當容器通過 docker run -it [image] 啟動時,輸出為:

hello
而如果通過 docker run -it [image] cloudman 啟動,則輸出為:

hello cloudman
將dockerfile修改為:

entrypoint [

"/bin/echo", "hello"

] cmd [

"world"

]

當容器通過 docker run -it [image] 啟動時,輸出為:

hello world
而如果通過 docker run -it [image] cloudman 啟動,輸出依舊為:

hello cloudman
entrypoint 中的引數始終會被使用,而 cmd 的額外引數可以在容器啟動時動態替換掉。

Dockerfile多階段構建

多階段構建 之前的做法 在docker17.05版本之前,構建docker映象,通常採用兩種方式 1.全部放入乙個dockerfile 一種方式是將所有的構建過程全都包含在乙個dockerfile中,包括專案及其依賴庫的編譯 測試 打包流程,這裡會帶來的一些問題 映象層次多,映象體積較大,部署時間變...

Docker多階段構建

在 docker 17.05 版本之前,我們構建 docker 映象時,通常會採用兩種方式 一種方式是將所有的構建過程編包含在乙個 dockerfile 中,包括專案及其依賴庫的編譯 測試 打包等流程,這裡可能會帶來的一些問題 package main import fmt func main 編寫...

Dockerfile多階段構建

我們在構建docker映象時,希望最後得到的映象越小越好,但是在構建時,總是會用到各種各樣複雜的環境,大部分都是臨時環境,只是為了生成對應的目標程式。比如我們經常會在opencv環境下編譯影象處理類程式,但其實目標程式只需要用的之前生成的子程式就行,不需要引入中間用到的環境。這裡我們就能用到dock...