尝试使用Docker的Devhub
事件的过程
由于@volpe28v开发的DevHub开发工具非常方便,因此我尝试在Docker中运行它。
由于Dockerhub上注册的DevHub镜像大多陈旧,因此我简单地创建了一个DockerFile。
关键词:Docker、DevHub、MongoDB
Dockerfile(一号)
利用Multi Stage功能来构建只包含构建结果和mongodb的镜像,以便于构建。
通过插入”wait-start.sh”脚本来等待mongodb启动,然后启动DevHub。
FROM node:9.5.0-alpine AS base
RUN apk add --no-cache git && \
git clone https://github.com/volpe28v/DevHub && \
cd DevHub && \
git checkout d4c24c0fdf72386a2003e8eb0f337f7b50294cca && \
npm install && \
npm run build
FROM base AS release
RUN apk add --no-cache mongodb supervisor && \
rm /usr/bin/mongoperf && \
mkdir /etc/supervisord.d
VOLUME /data/db
COPY --from=base /DevHub /DevHub
WORKDIR /DevHub
RUN mkdir -p /var/log/DevHub/
EXPOSE 3000
RUN ( \
echo "#!/bin/sh" && \
echo "set -e" && \
echo "until nc localhost 27017 -z ; do" && \
echo " echo 'Waiting for mongo'" && \
echo " sleep 1" && \
echo "done" && \
echo "echo 'mongo is up'" && \
echo "exec node app.js" \
) > /DevHub/wait-start.sh
RUN chmod +x /DevHub/wait-start.sh
RUN ( \
echo "[supervisorctl]" && \
echo "[supervisord]" && \
echo "autostart=true" && \
echo "redirect_stderr=true" && \
echo "nodaemon=true" && \
echo "[program:mongodb]" && \
echo "command=/usr/bin/mongod" && \
echo "priority=1" && \
echo "autostart=true" && \
echo "redirect_stderr=true" && \
echo "[program:devhub]" && \
echo "command=/DevHub/wait-start.sh" && \
echo "directory=/DevHub" && \
echo "priority=2" && \
echo "autostart=true" && \
echo "redirect_stderr=true" && \
echo "stderr_logfile = /var/log/DevHub/err.log" && \
echo "stdout_logfile = /var/log/DevHub/out.log" \
) > /etc/supervisord.conf
ENTRYPOINT ["supervisord", "--nodaemon", "--configuration", "/etc/supervisord.conf"]
多级功能 (Duō jí
计划准备多个FROM,将base的成果物部署到release上。然而,由于无法大幅减少容量,所以直接将”/DevHub”带过来了……如果能整理得更好一些,我想要上传到GitHub上。记录了无法减少容量的经过(2017/2/15)。
容量巨大的node_modules库(以千字节为单位)
2524 ./bootstrap
2984 ./moment
3432 ./es5-ext
4124 ./grunt-legacy-log-utils
4204 ./grunt-legacy-util
5048 ./globule
5804 ./jquery-ui
5836 ./watchpack
8968 ./webpack
22824 ./emojify.js
Dockerfile的容量减小版本
尝试卸载 webpack、watchpack 和 npm。
FROM node:9.5.0-alpine AS base
RUN apk add --no-cache git && \
git clone https://github.com/volpe28v/DevHub && \
cd DevHub && \
git checkout d4c24c0fdf72386a2003e8eb0f337f7b50294cca && \
npm install && \
npm run build
FROM base AS release
RUN apk add --no-cache tzdata
COPY --from=base /DevHub /DevHub
RUN cd /DevHub
WORKDIR /DevHub
RUN npm uninstall webpack watchpack
RUN npm uninstall npm -g
EXPOSE 3000
ENTRYPOINT ["node","app.js"]
因为我发现卸载后可以释放存储空间,所以我放弃了它,先将其上传到了Dockerhub。
无Mongodb的Dockerfile(第2部分)
Github -> GitHub (只需要一种选项)
FROM node:9.5.0-alpine AS base
RUN apk add --no-cache git && \
git clone https://github.com/volpe28v/DevHub && \
cd DevHub && \
git checkout d4c24c0fdf72386a2003e8eb0f337f7b50294cca && \
npm install && \
npm run build
FROM base AS release
RUN apk add --no-cache tzdata
COPY --from=base /DevHub /DevHub
WORKDIR /DevHub
EXPOSE 3000
ENTRYPOINT ["npm","start","--"]
用Alpine的Node镜像简单安装DevHub。
由于MongoDB有官方的Docker镜像,因此可以使用它。
在ENTRYPOINT中无法传递DevHub的启动选项,但是参考了这篇文章并成功通过添加“–”来传递选项。
运行命令
docker run -d --name mongo mongo:3.2.19-jessie
docker run -d -p 3000:3000 --link mongo:mongo -e "MONGODB_URI=mongodb://mongo/some_dbname" -e "TZ=Asia/Tokyo" ranran9/devhub-alpine:noMongodb -t SOME_TITLE
使用`mongo`命令来启动Mongodb,并将其链接到DevHub的映像上。
由于DevHub兼容Heroku的Mongodb,只需传递环境变量`MONGODB_URI`即可将先前启动的Mongodb实例命名为任意数据库并运行。
优点:
可以通过在一个MongoDB实例中更改数据库名称来运行多个Devhub,这只占用一点点空间(215 MB)。
缺点:
如果不使用DockerCompose等工具,似乎无法实现类似于”–restart=always”的自动执行配置。
为了简化操作,可能过早将Mongodb的启动检查去除了…
Mongodb搭载的Dockerfile(第三部分)
Github -> Github
FROM node:9.5.0-alpine AS base
RUN apk add --no-cache git && \
git clone https://github.com/volpe28v/DevHub && \
cd DevHub && \
git checkout d4c24c0fdf72386a2003e8eb0f337f7b50294cca && \
npm install && \
npm run build
FROM base AS release
RUN apk add --no-cache mongodb supervisor tzdata && \
rm /usr/bin/mongoperf && \
mkdir /etc/supervisord.d
VOLUME /data/db
COPY --from=base /DevHub /DevHub
WORKDIR /DevHub
RUN mkdir -p /var/log/DevHub/
EXPOSE 3000
COPY wait-start.sh .
RUN chmod +x /DevHub/wait-start.sh
COPY supervisord.conf /etc/
ENTRYPOINT ["supervisord", "--nodaemon", "--configuration", "/etc/supervisord.conf"]
将(第一)个Dockerfile中的shell转换为文件,然后将Mongodb添加到镜像中的Dockerfile。
运行命令
docker run -d -p 3000:3000 -e "DEVHUB_TITLE=TITLE" -e "TZ=Asia/Tokyo" ranran9/devhub-alpine
优点:
只需一个Docker实例即可立即使用DevHub。
缺点:
有点儿大(273MB)
更新历史
2017年2月15日,追記Docker镜像容量减小的神秘备忘录。
由于官方的Github更新了(d4c24c0fdf72386a2003e8eb0f337f7b50294cca),Dockerhub也进行了更新。