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