Docker 多階段構建示例 + Docker Hexo

前期準備

拉取 hexo source/_post 的分支

hexo 分支為 hexo markdown 源碼分支

git pull origin hexo

1
2
3
4
mkdir -p ~/hexo/source
cd ~/hexo/source
git init
git pull https://github.com/yanzhe919/yanzhe919.github.io.git hexo:hexo
  • 順便解釋一下, 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
2
3
4
5
6
7
FROM node:lts as build
LABEL maintainer="yan zhe <[email protected]>"
WORKDIR /hexo
VOLUME ["/hexo"]
RUN npm install hexo-cli -g
EXPOSE 4000
CMD []

構建鏡像

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
2
3
4
5
6
7
FROM node:lts-alpine as build
LABEL maintainer="yan zhe <[email protected]>"
RUN apk update && apk upgrade && \
apk add --no-cache git
RUN npm add hexo-cli -g
EXPOSE 4000
CMD []

構建鏡像

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
FROM node:lts as build
LABEL maintainer="yan zhe <[email protected]>"
WORKDIR /hexo
ARG package=package.json
COPY $package ./
# install node-prune (https://github.com/tj/node-prune)
RUN curl -sfL https://install.goreleaser.com/github.com/tj/node-prune.sh | bash -s -- -b /usr/local/bin
#RUN yarn install --production=true
RUN npm install
# remove development dependencies
RUN npm prune --production
FROM node:lts-slim
COPY --from=build /hexo /hexo
RUN npm install hexo-cli -g
VOLUME ["/hexo"]
EXPOSE 4000
CMD []

使用 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
FROM node:lts-alpine as build
LABEL maintainer="yan zhe <[email protected]>"
WORKDIR /hexo
ARG package=package.json
COPY $package ./
RUN apk update && apk upgrade && \
apk add --no-cache git curl && \
apk add --no-cache autoconf automake build-base libtool nasm pkgconfig libjpeg-turbo
RUN npm add hexo-cli -g && \
npm install --save
# install node-prune (https://github.com/tj/node-prune)
RUN curl -sfL https://install.goreleaser.com/github.com/tj/node-prune.sh | bash -s -- -b /usr/local/bin
#RUN yarn install --production=true
# remove development dependencies
RUN npm prune --production
FROM node:lts-alpine
COPY --from=build /hexo /hexo
RUN npm install hexo-cli -g
VOLUME ["/hexo"]
EXPOSE 4000
CMD []

使用 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

评论

此博客中的热门博文

GitHub Actions 示例 - Hexo CI/CD

MySQL 中 utf8 和 utf8mb4 的使用以及字符集相關