部署基于 GitHub 的图床 PicX

编写博客的时候,常常需要在文章中插入富媒体,比如 图片、视频等。有很多免费的图床 (sm.ms),也有基于云存储的的图床,它们的优缺点如下:

图床方案 优点 缺点
sm.ms 免费 图片不好管理、有的不支持 https
云存储 不占用自己的存储 付费、受制于平台、有的不支持 https
基于 GitHub 的图床 支持 https,图片存放在代码仓库不占用自己存储 不方便操作,开源软件参差不齐

笔者最初是通过 七牛云 存储图片,当时 (2015 年)还有免费存储空间以及 https,后来都要收费了。转投 GitHub repo,基于 git 命令上传图片。

现在,发现了开源的基于 GitHub 图床 web 管理方案: picx picgo ,经过对比最终选择了 picx。

使用镜像

本地使用

  1. 启动容器,推荐使用最新版镜像

    # 1. 启动容器
    docker run -d --name picx -p 5000:80 adolphlwq/picx:latest
    
  2. 访问 127.0.0.1:5000

  3. 参考官方文档 快速开始 进行设置

笔者基于官方代码构建了主要镜像版本,可以访问 adolphlwq/picx 查看具体版本,并选择合适的 tag

docker images
REPOSITORY       TAG               IMAGE ID       CREATED          SIZE
adolphlwq/picx   latest            4f318f53caa6   33 minutes ago   67MB
adolphlwq/picx   v2                f5c009421f11   41 hours ago     67MB
adolphlwq/picx   v2.5.0            f5c009421f11   41 hours ago     67MB
adolphlwq/picx   dev               08a617a54dba   42 hours ago     68.4MB

构建镜像

picx 可以使用官网的版本:https://picx.xpoet.cn/#/ 但是限制较多,我自己基于 v2 分支代码的 web 版本, 封装成 docker 镜像 ,容器化部署。

FROM node:lts-alpine as builder

WORKDIR /app
COPY . .
RUN npm install && npm run build

FROM nginx:stable-alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

如果构建速度较慢,大概率是 npm install 访问国外网络慢导致的,大陆开发者构建时可以使用国内的 mirror,以腾讯镜像为例

npm install --legacy-peer-deps --registry https://mirrors.cloud.tencent.com/npm/exit

奇技淫巧

实际上编写好 Dockerfile 后,无论是在 VPS 上,还是个人的笔记本(大陆网络),都因网络访问速度慢构建超时失败了。前后研究了 4-5 个小时也没构建陈宫个,笔者没有办法,最后想到了一个奇技淫巧,快速把 v2.4.0,v2.5.0,v3.0.0, v3.0.1 等 picx tag 都构建出来了。

办法就是在宿主机上运行 npm install --legacy-peer-deps --registry https://mirrors.cloud.tencent.com/npm/ 命令把 node_modules 下载好,构建的时候把 node_modules 一起传到 docker 的构建容器里,这样容器里 npm install的包都在 node_modules 中了,不需要额外下载,省去了网络耗时。

多平台构建镜像

docker 文档 Multi-platform images 中专门介绍了如果构建多平台的镜像。

注意,单独在 mac 或者 linux 上构建镜像并 push 到 docker hub,在 docker hub 上只有一个架构的镜像,而不会有两个。如果想同时构建多平台并且 push 时不相互覆盖,使用 buildx

docker buildx build --platform linux/amd64,linux/arm64 -t adolphlwq/picx:dev --builder multi-platfrom-builder --push .

龙芯支持

龙芯是大陆自主研发的 CPU 指令集架构,由于 2020 年发布,开源社区支持不完善,截至当前 (2024.4),docker 上的很多镜像都还不支持构建 linux/loong64的镜像。不过搜索到相关文章作为参考:

参考