构建支持registry v2的shipyard的镜像

在shipyard中添加registry 一直报失败,尝试了好几种方式,最终结论是:shipyard不支持registry v2。

感谢 hailwind提到的可以自己编译,并且给出了相应的步骤。
因在编译的过程中遇到了些坑,梳理后记录一下。

  1. 下载支持registry v2的shipyard代码
    地址:https://github.com/computerlyrik/shipyard/tree/registry-v2/
    可用git clone url ,也可直接下载zip包

  2. 编译shipyard-build镜像

cd shipyard  
mv Dockerfile.build Dockerfile
docker build -t shipyard-builder  .
  1. 启动shipyard-build 镜像
docker run -it shipyard-builder sh  

当以这样的方式启动容器后,执行````docker build -t shipyard-registry-v2 controller ``` 时就会报如下错误

Sending build context to Docker daemon 
Post http:///var/run/docker.sock/v1.19/build?cgroupparent=&cpuperiod=0&cpuquota=0&cpusetcpus=&cpusetmems=&cpushares=0&dockerfile=Dockerfile&memory=0&memswap=0&rm=1&t=shipyard-registry-v2: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?

应换可使用硬件资源的方式启动,然后重新装docker

docker run -ti --privileged shipyard-builder2  /bin/bash
apt-get install curl
## 安装 docker
curl -sSL https://get.docker.com/ | sh
service docker start
docker build -t shipyard-registry-v2 controller

docker build -t shipyard-registry-v2 controller
第一次执行该命令时,遇到一个错误 在ADD controller /bin/controller 时报说 没有 controller这个文件或目录
在Dockerfile本身就在controller目录下面,确实不存在 controller文件。

  1. 找寻controller
    从可用shipyard的 /bin/目录下 找到了 controller文件。
    学习了一下怎么从容器中拷贝文件到宿主机上
    docker cp <containerId>:/bin/controller /root/registry/
  2. 再次启动shipyard-build容器,并挂载目录
    为的就是将 宿主机上的 controller 能拷贝进容器中。
docker run -ti --privileged -v /root/registry/:/root/registry shipyard-builder /bin/bash
cp /root/registry/controller ./controller/
#但是事实证明,这样是没有用的,controller 需要自己生成,第二次build时 就生成啦,但原因是什么没有找到。
service docker start
#之前安装docker镜像记得保存,不然又要安装docker啦。
docker build -t shipyard-registry-v2 controller
  1. 启动自编译的shipyard-contrller
docker run -ti -d --restart=always --name shipyard-controller2 --link shipyard-rethinkdb:rethinkdb --link shipyard-swarm-manager:swarm  -p 58081:8080 shipyard-registry-v2:latest server -d tcp://swarm:3375
  1. 登录shipyard ,添加 registry


    shipyard-registry.jpg

    在添加仓库这里犯了一个低级的错误,因之前装了portus-且portus是自动装了registry的,我一直用 portus启动的registry 往shipyard中添加--导致一直需要出现认证失败。
    翻看了shipyard 的api,发现官方接口文档中根本就没有用户名和密码 这两参数-才想起 应该是portus需要登录验证的,而不是registry本身。
    于是单个装了registry,再往shipyard中添加 就ok 啦。

  2. 后记
    过了个国庆后,发现shipyard没有图形界面啦,查看源代码得知无bower_components目录下所有的js。

  1. 进入容器,发现static目录下缺失无bower_components目录
  2. 查看shipyard-registry-v2的源代码 也确实没有找到 bower_components目录
  3. 去原来的shipyard中查找 看到 bower_components
  4. 于是再次做镜像,以当前兼容v2的镜像为源,将 bower_components目录添加到static 目录下
FROM shipyard-registry-v2
ADD ./test /static/
#test目录下是bower_components
  1. 启动编译后的镜像,shipyard可看到图形界面啦。

存在疑问:为什么国庆前访问时OK的呢?实在是让我觉得费解。

推荐阅读更多精彩内容