可视化生信分析利器 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 交流,同时,这条命令执行完我们会看到命令提示符变成了:

195c96c0-4240-434d-b770-426a7bedd664.png

后面的 a64e7edccf38 就是这个 container 的 ID,接着我们可以在这个 container 中创建一个文件,如下:


echo -e "Hello, world." >/root/test.c



然后我们退出这个 container(执行 exit),并通过以下命令来将这个 container 保存成一个镜像:


docker commit  a64e7edccf38 centos:new_change


f07edd2a-66e1-471c-b5e6-6495e1264731.png


接着我们可以以这个镜像来启动另一个 container,如下:


docker run -i -t centos:new_change  /bin/bash


fe56fcdc-ef8e-4f08-925e-7404c873bd25.png

在该 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:latest

  • bgruening/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 栏没有中文处理):

de7c80a5-78ea-40f2-8a56-b1ba91126bfc.png



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源创计划”,欢迎正在阅读的你也加入,一起分享。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值