本文示範兩種使用 Dockerfile 的方法:

  1. 於 Container 階段才掛載專案,利用掛載的特性同步 Docker 內部的專案 Code 與本機的專案 Code,以因應開發時須持續變更 Code 的開發需求。
  2. 於 Build 階段,將專案複製進 Image。Docker 只負責啟動整個 Container;適用於專案已經穩定,只需將專案部屬到環境的狀況。

方法一:持續變更

Dockerfile

FROM node:latest
WORKDIR /app
EXPOSE 8080
ENTRYPOINT chmod 577 client && ./client

docker_todo.pl

#!/usr/bin/perl -w
use strict;
use Cwd;
my $dir = 'node_modules';

# install pnpm 
system("npm install pnpm -g");

# if don't have node_modules, install it
system("pnpm install") unless (-e $dir and -d $dir);

# run serve
system("npm run serve");

Usage

# 建立 image
docker build -t todos .
# 啟動 container,$PWD 代表當前使用者的目錄 
docker run --rm -v $PWD/client:/app -p 8080:8080 todos

方法二:部屬環境

Dockerfile

FROM node:lts-alpine  
# 首先安裝一個簡單的 http server。
# 在現實環境,我們會使用 nginx/apache 作為 http service。
RUN npm install -g http-server  
# 將 /app 資料夾作為當前的工作環境
WORKDIR /app  
# 複製 'package.json' 與 'package-lock.json'
COPY package*.json ./  
# 安裝專案的 Dependency
RUN npm install
# 將整個專案複製進 Docker
COPY . .  
# 使用 npm run build 建置專案
RUN npm run build  
# 暴露 8080 port
EXPOSE 8080 
# 在 container 啟動時,讓 http-server 入口指向 /dist 目錄。
CMD [ "http-server", "dist" ]

Usage

# 建立 image
docker build -t todos .
# 啟動 container
docker run -p 8080:8080 --rm todos

Reference

Docker 學習筆記 (五) -以一個TodoList實戰 Dockerfile