iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 9
0
Kubernetes

從Docker到Kubernetes-新手入門筆記系列 第 9

Day9-Dockerize Node.js Web應用程式(下)

取得正在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目錄混雜

避免重複安裝dependency

沒有任何程式碼修改,執行docker build .

因為docker沒偵測到變更,所以用cache rebuild

然而現有的statement順序下,只要

  • ./
  • src
  • test
    底下有檔案任何變更,則npm install要重新執行而不是使用cache,即便package.json沒有新增dependency

例如修改回傳字串為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,節省時間。


上一篇
Day8-Dockerize Node.js Web應用程式(上)
下一篇
Day10-Docker Compose(上)
系列文
從Docker到Kubernetes-新手入門筆記30

尚未有邦友留言

立即登入留言