使用 docker-node 測試 nodejs 專案
首先你的環境必須已經安裝 docker,參考「取得 docker」。
# 取得 nodejs,在此使用較舊版本 10
docker pull node:10
在專案中建立 docker-compose.yml 檔:
version: "2"
services:
node:
image: "node:10"
working_dir: /Users/shinder/Dropbox/my-nodejs-proj
environment:
- NODE_ENV=development
volumes:
- ./:/Users/shinder/Dropbox/my-nodejs-proj
ports:
- 3000:3000
command: "node ./src/index.js"
其中,比較要注意的是 ports,第一個 3000 是 host 使用的 port,第二個 3000 是 container 使用的 port。 執行使用 up,關閉使用 down:
# 啟動
docker-compose up
# 在背景中啟動
docker-compose up -d
# 關閉
docker-compose down
# 查看正在執行的 containers
docker ps
*** 在啟動專案的時候出錯了「invalid ELF header」,無法載入 bcrypt 模組。 問題出在,bcrypt 是平台相依性的,我的 host 是 MacOS,container 則是 Debian。
目前想到的解法是,重新建立 image 檔,將專案內的檔案(排除 node_modules)複製到 container,然後再重新 npm install 所有套件。要設定三個檔案:.dockerignore,Dockerfile,docker-compose.yml。
# .dockerignore
node_modules
# Dockerfile
FROM node:10
RUN npm install -g nodemon
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app
RUN npm install
EXPOSE 3000
# docker-compose.yml
version: "3"
services:
node:
build: .
working_dir: /usr/src/app
environment:
- NODE_ENV=development
volumes:
- ./:/usr/src/app
- /usr/src/app/node_modules
# 上式可以用 container 的路徑覆蓋原來 host 的 node_modules 目錄
ports:
- 3000:3000
command: "npm run dev"
執行 docker-compose up
即可建立,若調整設定檔後要重建可使用 docker-compose build
。
其它常用的指令:
# 連入 container 的 bash
docker exec -it <container-id> /bin/bash
# 列出所有 image 檔
docker image ls
# 移除某個 image 檔
docker rmi <image-id>
沒有留言:
張貼留言