取得正在running的container
docker ps -a
login到container查看目錄結構
docker exec -it 550dbfd3d66d
可以看到程式碼跟kernel的系統資料夾混雜在一起
如果我們想把相關程式碼固定copy到指定資料夾,直覺可能會改寫dockerfile如下
# 選擇node:alpine
FROM node:alpine
# copy 指定檔案及資料夾進container
COPY ./ nestapp
COPY src nestapp/src
COPY test nestapp/test
# 安裝dependencies
RUN npm install
# 指定啟動container後執行命令
CMD ["npm", "start"]
這樣執行docker build .
會得到package.json找不到
因為RUN npm install不是在nestapp資料夾下,而是在根目錄下,
當然可以RUN cd nestapp && npm install,但是到CMD的時候又遇到要進nestapp目錄底下去執行npm start
正確的作法是指定WORK DIR如下
# 選擇node:alpine
FROM node:alpine
# 指定預設/工作資料夾
WORKDIR /usr/nestapp
# copy 指定檔案及資料夾進container
COPY ./ ./
COPY src src
COPY test test
# 安裝dependencies
RUN npm install
# 指定啟動container後執行命令
CMD ["npm", "start"]
docker exec -it 208eb970afe8 sh
nest.js相關檔案目錄沒有跟原kernel目錄混雜
沒有任何程式碼修改,執行docker build .
因為docker沒偵測到變更,所以用cache rebuild
然而現有的statement順序下,只要
例如修改回傳字串為Hi!Docker
# 選擇node:alpine
FROM node:alpine
# 指定預設/工作資料夾
WORKDIR /usr/nestapp
# 只copy package.json檔案
COPY ./package.json ./
# 安裝dependencies
RUN npm install
# copy其餘目錄及檔案
COPY ./ ./
COPY src src
COPY test test
# 指定啟動container後執行命令
CMD ["npm", "start"]
修改程式碼,跑docker build .
npm install部分會用cache去build,節省時間。