尝试使用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"]

パターンRUN コマンドSIZE (非圧縮)アンインストール前何もしない257MBwebpackとwatchpack をuninstallRUN npm uninstall webpack watchpack257MBwebpackとwatchpackとnpm をuninstallRUN npm uninstall webpack watchpack && \ npm uninstall npm -g266MB

因为我发现卸载后可以释放存储空间,所以我放弃了它,先将其上传到了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也进行了更新。

bannerAds