参考文献
DockerHub:https://hub.docker.com/r/jefferyjob/node-hexo
GithubDockerfile:https://github.com/jefferyjob/node-hexo
Docker-composer管理hexo:https://github.com/jefferyjob/docker-compose-hexo
使用 Dockerfile 基于 alpine 系统,构建 nodejs 环境和 hexo 基础依赖以及 git 环境。
Dockerfile构建
编写镜像包
第1种方法:
# base image
FROM node:alpine
# MAINTAINER
MAINTAINER lbinjob@163.com
# work dir
WORKDIR /app
# run install
RUN npm config set registry https://registry.npm.taobao.org \
&& npm install -g hexo
# port
EXPOSE 4000
第2种方法:未来更好的扩展性,此处采用 alpine 从0到1开始构建。
# base image
FROM alpine:3.10
# MAINTAINER
MAINTAINER lbinjob@163.com
# work dir
WORKDIR /app
# run install
RUN apk add --no-cache nodejs \
&& apk add --no-cache git \
&& apk add --no-cache npm \
&& npm config set registry https://registry.npm.taobao.org \
&& npm install -g hexo
# port
EXPOSE 4000
镜像发布
镜像生成:
docker build -t node-hexo:1.0 .
- –tag 或 -t:镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签
- -f:指定要使用的Dockerfile路径
镜像测试:
# 查看镜像构建历史
docker history node-hexo:1.0
# run 一个测试容器
docker run -itd --name node-hexo-test node-hexo:1.0
# 进入容器
docker exec -it node-hexo-test /bin/sh
# 进行软件测试
$ node -v
v10.24.0
$ npm -v
6.14.11
$ git --version
git version 2.22.5
$ hexo -version
hexo-cli: 4.2.0
发布到DockerHub:
1、注册 Dockerhub 的仓库
注册地址:https://hub.docker.com/repository/create
名称要和你要发布的镜像名称保持一致哦
此处我创建的为 public 权限的 node-hexo 仓库
2、重命名
命名规范为:docker_username/repository_name
docker tag node-hexo:1.0 jefferyjob/node-hexo:1.0
3、登录docker
docker login -u jefferyjob
4、发布
docker push jefferyjob/node-hexo:1.0
注意,此版本发布后,把版本号改为 latest
然后再发布一次,让dockerhub中的latest保持最新。
5、高级技巧
你也可以将此仓库绑定到你的 github 仓库,每次修改 github 仓库的 dockerfile 的时候,实施 webhook 通知你的docker repository 实现自动更新 docker 镜像。
也可以在 dockerfile 中使用 ENTRYPOINT [“docker-entrypoint.sh”] 管理入口,提供更加便捷化的操作。
问题
开始我使用Nodejs
官方的源码包安装Nodejs
。也就是将官网下载的tar
格式的包解压后,再链接二进制文件的方式。
但是发生了一个问题:我将源码包里边的node
可执行文件链接到/usr/sbin/node
后,执行node -v
,提示command not found
。
原因:
几经查找,发现原来是因为Nodejs
官网提供的源码包是使用glibc
库打包的,而Alpine
使用的是musl
库
解决方案:
- 使用
Alpine
自带的apk
进行安装:apk add nodejs npm
。 - 使用非官方构建源里边的包,里边有
musl
版本的:https://unofficial-builds.nodejs.org/download/release/ 。虽说是非官方构建源,也是官网上提供的链接。
反思:
之前也看到过Alpine
关于编译库的坑,但是没想到这么快就让我遇上了,而且的确容易被command not found
这个提示误导,这使我一度怀疑dash
,$PATH
和ln
。