[筆記] Docker 包檔案至Image

由於是用Java開發 (maven build),也會把自己的一些功能包成模組
所有編譯或下載後的模組會放在 /home/User/.m2底下
這時候問題就來了
因為遠端那台的Docker machine沒有Source Code
編譯出來的模組又不在專案目錄下,掛載volume的方式,檔案都在本地端
就會導致Container執行時,找不到自己的模組而噴Error

在不動 /home/USER/.m2的設定與不掛載Volume的前提下
我們可以於build image時
更改maven build的target目錄到Docker工作目錄(Working Directory)下
接著在執行時,再把檔案移回去即可

Dockerfile :
FROM maven:3.3.9-jdk-8-alpine

RUN mkdir -p /PROJECT_FOLDER
WORKDIR /PROJECT_FOLDER
COPY . /PROJECT_FOLDER

RUN mvn -Dmaven.repo.local=repository/ clean install

RUN chmod +x /PROJECT_FOLDER/MODULE_A_FOLDER/entrypoint.sh
RUN chmod +x /PROJECT_FOLDER/MODULE_B_FOLDER/entrypoint.sh
CMD ["/bin/bash", "entrypoint.sh"]

Run image時,一開始會先進入entrypoint.sh
再把檔案移到 /root/.m2底下

entrypoint.sh :
#!/usr/bin/env bash
mv ../repository /root/.m2
# ... YOUR_CODE ...

這樣就不用在部屬時全部重新編譯
一來會比較快部屬完成
二來也可以確保test與production的一致性

當然,每次都重新下載跟編譯很花時間
Dev時一樣掛載Volume即可

同樣的道理
如果我們不是使用Webpack的方式開發時
或是我們需要覆蓋一些系統其他服務的設定檔
可以把這些檔案移到Project Folder,即可包入Image裡
Run image的時候再移出來

BTW, 之前說Code snippet找不到好用的,後來發現也可以用hackmd.io的
編輯好在複製貼上過來即可

留言