可视化生信分析利器 Galaxy 之 Docker 开发
1. 背景
我们常常会基于某个 image 来启动一个 container,在这个 container 中我们可能会执行某些操作,比如创建一个文件,但是当这个 container 退出以后,如果我们以同一个的 image 启动了另一个 container,在这个 container 中是看不到之前那个 container 创建的文件的。如果想让后面的 container 看到之前那个 container 创建的文件,就要把之前那个 container 保存成一个镜像,然后基于这个镜像来启动后面的那个 container。
2. Create Image from Container
举个简单的例子:(假设我们都是以root权限操作)
docker run -i -t centos:7.3.1611 bash /bin/bash
该命令执行完我们就基于 centos:7.3.1611 启动了一个 container,在这个 container 中我们通过 bash 来与之前的 container 交流,同时,这条命令执行完我们会看到命令提示符变成了:

后面的 a64e7edccf38 就是这个 container 的 ID,接着我们可以在这个 container 中创建一个文件,如下:
echo -e "Hello, world." >/root/test.c
然后我们退出这个 container(执行 exit),并通过以下命令来将这个 container 保存成一个镜像:
docker commit a64e7edccf38 centos:new_change

接着我们可以以这个镜像来启动另一个 container,如下:
docker run -i -t centos:new_change /bin/bash

在该 containe r中我们可以找到之前创建的 test.c 文件,如果我们以原来的 centos:7.3.1611 来启动后一个 container,是找不到 test.c 的。
3. Docker Galaxy Container
基于前面的知识,我们现在对基于 shenweiyan/galaxy-dev:latest 镜像的 container 进行中文化处理,并打包成 image,提交到阿里云 docker 镜像中心。
关于 shenweiyan/galaxy-dev:latest 镜像,这里需要说明两点:
shenweiyan/galaxy-dev:latest镜像来源于bgruening/galaxy-stable基础镜像:docker tag bgruening/galaxy-stable:latest shenweiyan/galaxy-dev:latestbgruening/galaxy-stable:latest详细信息,请参考:https://github.com/bgruening/docker-galaxy-stable
3.1. 登陆,安装 node
bgruening/galaxy-stable(v17.09) 默认的 node 版本为 v0.10.25,该版本在使用 make client 静态文件打包的时候会出错,因此需要先升级 node。
1. 获取正在运行的 Galaxy container
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79f2b6d67c6a shenweiyan/galaxy-dev:latest "/usr/bin/startup" 20 hours ago Up About a minute 443/tcp, 8800/tcp, 9002/tcp, 0.0.0.0:10021->21/tcp, 0.0.0.0:10022->22/tcp, 0.0.0.0:10080->80/tcp sharp_poincare
2. 进入运行中的 Galaxy container
$ docker exec -it 79f2b6d67c6a bash
root@79f2b6d67c6a:/galaxy-central# which node
/usr/bin/node
root@79f2b6d67c6a:/galaxy-central# node -v
v0.10.25
3. 源码安装升级 node
root@79f2b6d67c6a:/galaxy-central# cd /export/tool_deps/
root@79f2b6d67c6a:/export/tool_deps# mkdir source local
root@79f2b6d67c6a:/export/tool_deps# cd source
# node-v9.2.0 源码下载
root@79f2b6d67c6a:/export/tool_deps/source# wget https://nodejs.org/download/release/latest-v0.12.x/node-v0.12.18.tar.gz
root@79f2b6d67c6a:/export/tool_deps/source# tar zvxf node-v0.12.18.tar.gz
# node-v0.12.18 源码编译安装(非常耗时间)
root@79f2b6d67c6a:/export/tool_deps/source# cd node-v9.2.0
root@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18# ./configure --prefix=/export/tool_deps/local/node-v0.12.18
root@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18# make
root@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18# make install
# 更改默认 node
root@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18# mv /usr/bin/node /usr/bin/node.bak
root@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18# mv /usr/bin/npm /usr/bin/npm.bak
root@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18# ln -s /export/tool_deps/local/node-v0.12.18/bin/* /usr/local/sbin/node
# 确认默认 node、npm 版本
root@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18# node -v
v0.12.18
root@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18# npm -v
2.15.11
3.2. Galaxy 中文配置
Galaxy 默认的中文配置位于 <galaxy_root>/client/galaxy/scripts/nls/zh,不同的中文翻译可自行修改该目录下的 locale.js 文件进行配置。
Galaxy 部分中文翻译,请参考:https://github.com/istevenshen/galaxy/blob/dev/client/galaxy/scripts/nls/zh/locale.js
3.3. 打包静态文件
root@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18# su galaxy
galaxy@79f2b6d67c6a:/export/tool_deps/source/node-v0.12.18$ cd /galaxy-central/
galaxy@79f2b6d67c6a:/galaxy-central$ node -v
v0.12.18
galaxy@79f2b6d67c6a:/galaxy-central$ make client
cd client && npm install
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.1.2 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.1.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
added 851 packages in 72.496s
cd client && node_modules/grunt-cli/bin/grunt
Running "check-modules" task
Running "uglify:target" (uglify) task
>> 231 sourcemaps created.
>> 231 files created.
Running "webpack" task
bundling webpack apps for production...
...
Running "less:dist" (less) task
>> 7 stylesheets created.
Running "clean:clean" (clean) task
>> 1 path cleaned.
Done, without errors.
# 退出 Galaxy container
galaxy@79f2b6d67c6a:/galaxy-central$ exit
exit
root@79f2b6d67c6a:/usr/local/source/node-v0.12.18#
exit
3.4. 停止 Galaxy container
# 执行停止操作前,请先确保 Galaxy container 已经退出,这一点非常重要
# 查看运行中的 Galaxy container
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
79f2b6d67c6a shenweiyan/galaxy-dev:latest "/usr/bin/startup" 21 hours ago Up 33 minutes 443/tcp, 8800/tcp, 9002/tcp, 0.0.0.0:10021->21/tcp, 0.0.0.0:10022->22/tcp, 0.0.0.0:10080->80/tcp sharp_poincare
# 停止 Galaxy container
$ docker stop 79f2b6d67c6a
79f2b6d67c6a
3.5. 保存 container 为新镜像
# 保存镜像
$ docker commit 79f2b6d67c6a shenweiyan/galaxy-new
sha256:5629bfe51267105800600b8150ecbdd0d3b9bcd489893ec033034418da329129
3.6. 运行 galaxy-new 新镜像
# 查看所有镜像
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
shenweiyan/galaxy-new latest 5629bfe51267 About an hour ago 2.46GB
shenweiyan/galaxy-dev latest d603aeb08687 22 hours ago 2.22GB
# 查看正在运行的 container
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 基于新镜像,启动 container
$ docker run -d -p 11080:80 -p 11021:21 -p 11022:22 -v /data/docker/galaxy-data/:/export/ shenweiyan/galaxy-new:latest
7dfe36b780e37612548509d900cf0fbd403c16117e3aa211d9147b04d257a8f0
# 查看正在运行的 container
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7dfe36b780e3 shenweiyan/galaxy-new:latest "/usr/bin/startup" 14 seconds ago Up 13 seconds 443/tcp, 8800/tcp, 9002/tcp, 0.0.0.0:11021->21/tcp, 0.0.0.0:11022->22/tcp, 0.0.0.0:11080->80/tcp wizardly_lichterman
最后,浏览器打开 “http://服务器ip:110080” 看到基于 galaxy-new 的中文版 Docker Galaxy(Tools 栏没有中文处理):

4. 阿里云镜像提交
4.1. 将镜像推送到 aliyun registry
详细的阿里云 Docker 镜像上传请参考:http://blog.shenweiyan.cn/post/Docker-%E9%95%9C%E5%83%8F%E4%B8%8A%E4%BC%A0%E5%88%B0%E9%98%BF%E9%87%8C%E4%BA%91,这里只记录一下主要的上传操作。
# username 为阿里云 docker 账户,需要先注册
$ sudo docker login --username=1910866178@qq.com registry.cn-shenzhen.aliyuncs.com
# [ImageId], [镜像版本号]请你根据自己的镜像信息进行填写
$ sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/stevendev/galaxy-new:[镜像版本号]
$ sudo docker push registry.cn-shenzhen.aliyuncs.com/stevendev/galaxy-new:[镜像版本号]
TIP:注意您的网络环境
从阿里云 ECS 推送镜像时,可以选择走内网,速度将大大提升,并且将不会损耗您的公网流量。
如果您申请的机器是在经典网络,请使用 registry-internal.cn-shenzhen.aliyuncs.com 作为 registry 的域名登录, 并作为镜像名空间前缀。
如果您申请的机器是在 vpc 网络的,请使用 registry-vpc.cn-shenzhen.aliyuncs.com 作为 registry 的域名登录, 并作为镜像名空间前缀。
到这里,你的 Galaxy Docker 镜像已经上传完成,接下来可以把你的镜像分享给其他人,让他们部署使用或者在你的镜像基础上进行更深入的开发。
本文分享自微信公众号 - 生信科技爱好者(bioitee)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

浙公网安备 33010602011771号