Docker 多階段構建示例 + Docker Hexo
前期準備
拉取 hexo source/_post 的分支
hexo
分支為 hexo markdown 源碼分支
git pull origin hexo
1 | mkdir -p ~/hexo/source |
- 順便解釋一下,
git pull origin hexo
相當於git fetch origin hexo
+git checkout -b hexo origin/hexo
cd ~/hexo
,以下操作都在~/hexo
下執行
以前正常使用 Dockerfile ,如 node:lts
編輯並創建 Dockerfile , vim Dockerfile_lts
vim Dockerfile_lts
1 | FROM node:lts as build |
構建鏡像
docker build -t hexo-blog:0.0.1 -f ~/hexo/Dockerfile_lts .
鏡像大概 933MB
安裝插件, package.json
docker run -it --rm -v ~/hexo/source:/hexo hexo-blog:0.0.1 sh -c "cd /hexo;npm install"
有些插件可能需要從源碼編譯,但是 lts 版本帶了很多編譯工具
測試,生成並顯示頁麵
docker run -it --rm -p 80:4000 -v ~/hexo/source:/hexo hexo-blog:0.0.1 sh -c "cd /hexo;hexo generate && hexo server"
正在使用的 Dockerfile ,如 node:alpine
編輯並創建 Dockerfile , vim Dockerfile_alpine
vim Dockerfile_alpine
1 | FROM node:lts-alpine as build |
構建鏡像
docker build -t hexo-blog:0.0.3 -f ~/hexo/Dockerfile_alpine .
鏡像大概 123MB
安裝插件, package.json
docker run -it --rm -v ~/hexo/source:/hexo hexo-blog:0.0.3 sh -c "cd /hexo;npm install"
有些插件可能需要從源碼編譯,需要使用
apk add
先進行安裝編譯工具 ,如我正在使用的插件
docker run -it --rm -v ~/hexo/source:/hexo hexo-blog:0.0.3 sh -c "apk add --no-cache autoconf automake build-base libtool nasm pkgconfig libjpeg-turbo;cd /hexo;npm install"
測試,生成並顯示頁麵
docker run -d --name hexo -p 80:4000 -v ~/hexo/source:/hexo hexo-blog:0.0.3 sh -c "cd /hexo; hexo generate && hexo server"
順便使用 -d 後台運行。
查看日誌
docker logs hexo
刪除容器
docker rm hexo
刪除前如還在運行,最好是先停止
docker stop hexo
,當然有把握,可以 force 直接刪除-f
多階段構建 (multi-stage build)
以上都為順便的記錄。主要是想看看 Docker 多階段構建 (multi-stage build) 。隻是使用 Hexo 作為示例,但是它並不是很適合。可以直接使用 Github Action
工作流自動化部署。
Multi-stage Dockerfile ,如 node:lts 編譯,node:lts_slim 運行
編輯並創建 Dockerfile , vim Dockerfile_lts_build
這裏隻是示例,就直接將
package.json
打包進鏡像中了。構建鏡像中安裝插件
vim Dockerfile_lts_build
1 | FROM node:lts as build |
使用
node-prune
本來是想進一步縮小鏡像,但是實際測試中,似乎並沒有,可能 Hexo Demo 不行。感興趣的可以看下 三步縮小 Node 鏡像
構建鏡像
docker build --build-arg package=source/package.json -t hexo-blog:0.0.2 --no-cache -f ~/hexo/Dockerfile_lts_build .
--no-cache=true
,將中間生成的 cache 構建後刪除。來自 官方最佳實踐。不過,還是建議測試 build 時候不要加上
如果沒加,需要刪除緩存
docker image prune -f
鏡像大概 330MB
拷貝鏡像中文件,已安裝的插件
docker run --name hexo hexo-blog:0.0.2
docker cp hexo:/hexo/node_modules ~/hexo/source/
此時容器已停止,
docker cp
一樣可用
測試,生成並顯示頁麵
docker run -it --rm -p 80:4000 -v ~/hexo/source:/hexo hexo-blog:0.0.2 sh -c "cd /hexo;hexo generate && hexo server"
Multi-stage Dockerfile ,如 node:lts-alpine 編譯,另一個 node:lts-alpine 運行
編輯並創建 Dockerfile , vim Dockerfile_alpine_build
這裏隻是示例,就直接將
package.json
打包進鏡像中了。構建鏡像中安裝插件
vim Dockerfile_alpine_build
1 | FROM node:lts-alpine as build |
使用
node-prune
本來是想進一步縮小鏡像,但是實際測試中,似乎並沒有,可能 Hexo Demo 不行。感興趣的可以看下 三步縮小 Node 鏡像
構建鏡像
docker build --build-arg package=source/package.json -t hexo-blog:0.0.4 --no-cache -f ~/hexo/Dockerfile_alpine_build .
--no-cache=true
,將中間生成的 cache 構建後刪除。來自 官方最佳實踐。不過,還是建議測試 build 時候不要加上
如果沒加,需要刪除緩存
docker image prune -f
鏡像大概 300MB
拷貝鏡像中文件,已安裝的插件
docker run --name hexo hexo-blog:0.0.4
docker cp hexo:/hexo/node_modules ~/hexo/source/
此時容器已停止,
docker cp
一樣可用
測試,生成並顯示頁麵
docker run -it --rm -p 80:4000 -v ~/hexo/source:/hexo hexo-blog:0.0.4 sh -c "cd /hexo;hexo generate && hexo server"
Docker Hexo 其他命令
在多階段構建 (multi-stage build) 中,如果沒有加 --no-cache
,除了 <none>
鏡像,可能還會產生一些已停止的容器
同時刪除多個符合篩選條件的 docker 容器
如:刪除已停止的容器
docker rm $(docker container ls -f "status=exited" -q)
刪除所有容器
docker rm $(docker container ls -aq)
Docker Hexo 新增 markdown
docker run -it --rm -p 4000:4000 -v ~/hexo/source:/hexo hexo-blog:alpine sh -c "cd /hexo;hexo new 'use docker multi-stage build'"
Docker Hexo 根據 markdown 生成頁麵
docker run -it --rm -p 80:4000 -v ~/hexo/source:/hexo hexo-blog:alpine sh -c "cd /hexo;hexo generate"
Docker Hexo 根據 markdown 清理並生成頁麵
docker run -it --rm -p 4000:4000 -v ~/hexo/source:/hexo hexo-blog:alpine sh -c "cd /hexo;hexo clean && hexo generate"
Docker Hexo 初始化
docker run -it --rm -p 4000:4000 -v ~/hexo/source:/hexo hexo-blog:alpine sh -c “cd /hexo;hexo init blog”
Github Action 自動化構建 - Hexo
另外寫一篇好了 Github Action 自動化構建 - Hexo
评论
发表评论