本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或从新修改使用,但须要注明来源。 署名 4.0 国际 (CC BY 4.0)html
本文做者: 苏洋前端
建立时间: 2020年03月09日 统计字数: 6225字 阅读时间: 13分钟阅读 本文连接: soulteary.com/2020/03/09/…node
在《修理 Ghost 中文输入法的 BUG》一文中,经过给源码打补丁,并进行编译的方式,咱们解决了 Ghost 的“陈年固疾”:不能正常输入中文。git
两个月过去了,Ghost 开启了鸡血模式,不讲道理的更新了若干版本,从当时的 3.3.0 飙升至 3.9.0,考虑到项目中有依赖 Ghost,须要持续的更新维护,那么就在这里分享一下,如何更好的折腾它。github
在GitHub 的仓库中,咱们能够看到,解决这个 Bug 须要两步走:docker
而在使用和维护上,必须考虑如下几点:npm
因为 Ghost 服务端脚本/模版不须要构建使用,咱们以修改处理比较“麻烦”的 Ghost 前端资源为例,讲讲如何优化 Dockerfile。编程
在代码仓库中,咱们能够看到 Dockerfile
的内容是这样编写的:json
FROM node:12-alpine
LABEL maintainer="soulteary@gmail.com"
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US.UTF-8
ENV LC_ALL=en_US.UTF-8
RUN echo '' > /etc/apk/repositories && \
echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.10/main" >> /etc/apk/repositories && \
echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.10/community" >> /etc/apk/repositories && \
echo "Asia/Shanghai" > /etc/timezone
RUN apk update && apk add git && \
yarn global add knex-migrator grunt-cli ember-cli bower
COPY patches/mobiledoc-kit/event-manager.js /patches/mobiledoc-kit/event-manager.js
RUN git clone https://github.com/TryGhost/mobiledoc-kit.git /mobiledoc-kit && \
cd /mobiledoc-kit && \
git checkout 3b0f375d32f7183a4eee9cce5373ebabeb249165 && \
cp /patches/mobiledoc-kit/event-manager.js /mobiledoc-kit/src/js/editor/event-manager.js && \
yarn && \
cp -r /mobiledoc-kit/dist /patches/mobiledoc-kit/dist && \
rm -rf /mobiledoc-kit
RUN git clone --recurse-submodules https://github.com/TryGhost/Ghost.git /Ghost && \
cd /Ghost && \
git checkout 3.3.0 && \
yarn setup
RUN rm -rf /Ghost/core/client/node_modules/\@tryghost/mobiledoc-kit/dist && \
cp -r /patches/mobiledoc-kit/dist /Ghost/core/client/node_modules/\@tryghost/mobiledoc-kit/
WORKDIR /Ghost
RUN grunt prod
EXPOSE 2368
CMD ["npm", "start"]
复制代码
这里存在几个问题:bash
mobiledoc-kit
和 Ghost
代码升级管理。明确须要解决的问题以后,解决问题就容易多了。
咱们首先须要将“版本”定义为变量,而后抽象出来,考虑到不但愿将来每次代码升级都须要修改 Dockerfile,咱们可使用 它的 ARG
指令,对于原始内容进行优化,例如:
# FOR GHOST 3.9.0
ARG MOBILEDOC_KIT_VERSION=v0.11.1-ghost.4
RUN git clone https://github.com/TryGhost/mobiledoc-kit.git /mobiledoc-kit && \
cd /mobiledoc-kit && \
git checkout $MOBILEDOC_KIT_VERSION && \
cp /patches/mobiledoc-kit/event-manager.js /mobiledoc-kit/src/js/editor/event-manager.js && \
yarn && \
cp -r /mobiledoc-kit/dist /patches/mobiledoc-kit/dist && \
rm -rf /mobiledoc-kit
复制代码
将来若是 Ghost 发布 4.0.0
,这个依赖的组件也有了版本变化,那么在构建的时候只须要添加构建参数,便可完成新版本镜像的构建,而不用在修改 Dockerfile,像是这样:
docker build --build-arg MOBILEDOC_KIT_VERSION=v0.11.1-ghost.5
复制代码
原始的 Dockerfile 中,咱们获取 Ghost 源码将其整个仓库都下载下来,在网络条件很差的时候,很是影响构建。
因此能够经过限定 depth
克隆深度,以及 branch
下载分支,限定要获取的代码量,只下有用的内容。
ARG GHOST_RELEASE_VERSION=3.9.0
RUN git clone --recurse-submodules https://github.com/TryGhost/Ghost.git --depth=1 --branch=$GHOST_RELEASE_VERSION /Ghost && \
cd /Ghost && \
yarn setup
复制代码
能够判断的方法不少,可是最简单的自动化方案莫过于判断代码文件是否被修改过。
先使用 shasum
或者任何你用的顺手的计算工具,对目标要进行补丁的文件进行校验值计算,若是你使用的镜像的基础系统是 Ubuntu 可使用下面的方式进行校验:
# 计算校验值
shasum -a 256 path_to_project/event-manager.js
0faeb4eb1cd177f3d7972fda6c52a0089a4814171cedd5c43a7302f027b26723 path_to_project/event-manager.js
# 进行校验
echo "0faeb4eb1cd177f3d7972fda6c52a0089a4814171cedd5c43a7302f027b26723 path_to_project/event-manager.js" | shasum -a 256 -c
复制代码
这里使用 Alpine 发行版做为系统的容器,在不安装额外软件的状况下,能够换为 md5sum
来进行计算,原来的 Dockerfile 能够更新成下面这样:
# FOR GHOST 3.9.0
ARG MOBILEDOC_KIT_VERSION=v0.11.1-ghost.4
ARG EVENT_MANAGER_HASH=9a0456060f1c816a0a66bdcf3363e928
RUN git clone https://github.com/TryGhost/mobiledoc-kit.git /mobiledoc-kit && \
cd /mobiledoc-kit && \
git checkout $MOBILEDOC_KIT_VERSION && \
(echo "$EVENT_MANAGER_HASH /mobiledoc-kit/src/js/editor/event-manager.js" | md5sum -c -s -) && \
cp /patches/mobiledoc-kit/event-manager.js /mobiledoc-kit/src/js/editor/event-manager.js && \
yarn && \
cp -r /mobiledoc-kit/dist /patches/mobiledoc-kit/dist && \
rm -rf /mobiledoc-kit
复制代码
若是校验值和咱们传递的不一致,构建会自动中断,若是发生这个情况,那么理论来讲咱们须要调整补丁逻辑,并计算出新的文件的校验值。
为了方便有相同需求的同窗,这里给出完整的镜像文件,相关代码也已经上传 GitHub。
FROM node:12-alpine
LABEL maintainer="soulteary@gmail.com"
ENV LANG en_US.UTF-8
ENV LANGUAGE en_US.UTF-8
ENV LC_ALL=en_US.UTF-8
RUN echo '' > /etc/apk/repositories && \
echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.10/main" >> /etc/apk/repositories && \
echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.10/community" >> /etc/apk/repositories && \
echo "Asia/Shanghai" > /etc/timezone
RUN apk update && apk add git && \
yarn global add knex-migrator grunt-cli ember-cli bower
COPY patches/mobiledoc-kit/event-manager.js /patches/mobiledoc-kit/event-manager.js
ARG GHOST_RELEASE_VERSION=3.9.0
RUN git clone --recurse-submodules https://github.com/TryGhost/Ghost.git --depth=1 --branch=$GHOST_RELEASE_VERSION /Ghost && \
cd /Ghost && \
yarn setup
# FOR GHOST 3.9.0
ARG MOBILEDOC_KIT_VERSION=v0.11.1-ghost.4
ARG EVENT_MANAGER_HASH=9a0456060f1c816a0a66bdcf3363e928
RUN git clone https://github.com/TryGhost/mobiledoc-kit.git /mobiledoc-kit && \
cd /mobiledoc-kit && \
git checkout $MOBILEDOC_KIT_VERSION && \
(echo "$EVENT_MANAGER_HASH /mobiledoc-kit/src/js/editor/event-manager.js" | md5sum -c -s -) && \
cp /patches/mobiledoc-kit/event-manager.js /mobiledoc-kit/src/js/editor/event-manager.js && \
yarn && \
cp -r /mobiledoc-kit/dist /patches/mobiledoc-kit/dist && \
rm -rf /mobiledoc-kit
RUN rm -rf /Ghost/core/client/node_modules/\@tryghost/mobiledoc-kit/dist && \
cp -r /patches/mobiledoc-kit/dist /Ghost/core/client/node_modules/\@tryghost/mobiledoc-kit/
WORKDIR /Ghost
RUN grunt prod
EXPOSE 2368
CMD ["npm", "start"]
复制代码
处理软件的版本更新,多多少少须要作一些简单的分析,下面这些在线连接或许能够帮到你(以此次处理 3.9.0 为例):
.submodule
文件,不过须要两个步骤操做,略显麻烦。@tryghost/mobiledoc-kit
依赖,并确认其版本。下一篇 Ghost 相关的内容,或许会聊聊怎么在容器中使用云服务(oss/cos)对象储存,以及如何搭配 SSO 单点登陆使用 Ghost。
--EOF
我如今有一个小小的折腾群,里面汇集了一些喜欢折腾的小伙伴。
在不发广告的状况下,咱们在里面会一块儿聊聊软件、HomeLab、编程上的一些问题,也会在群里不按期的分享一些技术沙龙的资料。
喜欢折腾的小伙伴欢迎扫码添加好友。(请注明来源和目的,不然不会经过审核)