无法将泊坞窗图像推送到本地OpenShift Originregistry

我们的目标是能够在我的笔记本电脑上拍摄Docker镜像,并将其推送到OpenShift Origin映像registry(由oc cluster up )来进行本地开发。 目前还不清楚我是否做错了什么,或者Docker或OpenShift Origin有错误。 对于那些不熟悉OpenShift Origin的人:

https://github.com/openshift/origin/blob/master/docs/cluster_up_down.md

任何照明信息将不胜感激。 以下是我迄今为止所尝试的:

 # oc cluster up Starting OpenShift using openshift/origin:v3.6.0 ... OpenShift server started. The server is accessible via web console at: https://127.0.0.1:8443 You are logged in as: User: developer Password: <any value> To login as administrator: oc login -u system:admin # docker container ls | fgrep origin-docker-registry 9de6bb0cdd28 openshift/origin-docker-registry "/bin/sh -c '/usr/..." # docker inspect 9de6bb0cdd28 | fgrep DOCKER_REGISTRY_PORT "DOCKER_REGISTRY_PORT_5000_TCP_PROTO=tcp", "DOCKER_REGISTRY_PORT=tcp://172.30.1.1:5000", "DOCKER_REGISTRY_PORT_5000_TCP_PORT=5000", "DOCKER_REGISTRY_PORT_5000_TCP_ADDR=172.30.1.1", "DOCKER_REGISTRY_PORT_5000_TCP=tcp://172.30.1.1:5000", # oc whoami -t qH2cTKtIpr1QB1dMw10ffiDGX1iH_uocrtXaFPyTei8 # docker login -u developer -p qH2cTKtIpr1QB1dMw10ffiDGX1iH_uocrtXaFPyTei8 172.30.1.1:5000 Login Succeeded # docker tag alpine:latest 172.30.1.1:5000/alpine:latest # docker push 172.30.1.1:5000/alpine:latest The push refers to a repository [172.30.1.1:5000/alpine] 5bef08742407: Preparing error parsing HTTP 400 response body: unexpected end of JSON input: "" 

我知道跑高山不会产生任何有趣的东西。 无论我尝试推送什么图像,结果都是一样的。 login似乎实际工作。 如果我删除或更改标记的任何部分,login失败。 我正在运行的Docker版本:

 # docker version Client: Version: 17.06.0-ce API version: 1.30 Go version: go1.8.3 Git commit: 02c1d87 Built: Fri Jun 23 21:31:53 2017 OS/Arch: darwin/amd64 Server: Version: 17.06.0-ce API version: 1.30 (minimum version 1.12) Go version: go1.8.3 Git commit: 02c1d87 Built: Fri Jun 23 21:51:55 2017 OS/Arch: linux/amd64 Experimental: true 

您可以像Graham指出的那样暴露registry,但这不是必需的。

在你使用内部IP的情况下, docker push 172.30.1.1:5000/alpine:latest push命令docker push 172.30.1.1:5000/alpine:latest是不正确的。 无论哪种情况(外部路由或内部IP),内部registry将基于图像名称空间和名称为您创build适当的图像stream。 图像stream的名称和名称空间/项目是从推送中获取的。 这意味着你需要确保你用三个元素来标记图像:

  • dockerregistryIP和端口(外部路由或内部IP)
  • 您的用户有权访问的命名空间/项目(在oc cluster up情况下, myproject是您的用户有权访问的默认项)
  • 最后是图像stream名称

在你的情况下,docker推动应该看起来像这样: docker push 172.30.1.1:5000/myproject/alpine:latest

当试图推送泊坞窗图像时,可能会有一些问题可能会受到影响。

在这之前,通常情况下,访问内部映像registry的方法是使用路由来公开它。 由于使用IP只适用于oc cluster up ,因此将显示如何使用路由,而不是通用。

对于oc cluster up ,您可以运行:

 oc expose svc/docker-registry -n default --as system:admin 

这将创build一个内部映像registry的URL:

 http://docker-registry-default.127.0.0.1.nip.io/ 

下一步login到内部图像registry使用:

 docker login -u developer -p `oc whoami -t` http://docker-registry-default.127.0.0.1.nip.io:80/ 

请确保在login时在URL中使用:80 。 如果使用安全路由公开内部映像registry,则会改为使用:443而不是:80

接下来,要标记图像,但要小心标记图像,因为要包含应添加图像stream的项目名称。

 docker tag alpine:latest docker-registry-default.127.0.0.1.nip.io:80/myproject/alpine 

看看我如何在标签中包含myproject ,因为这是我最终想要的项目。

详情:

在名称中再次使用:80作为端口。 login时需要URL中的端口,即使给定了http ,也可能是3.6.0或docker命令行客户端中的一个bug。 他们在OpenShift Online上提到了这一点,它使用的是3.6.0。

现在可以推送图像:

 docker push docker-registry-default.127.0.0.1.nip.io:80/myproject/alpine 

完整的命令序列是:

 $ oc expose svc/docker-registry -n default --as system:admin route "docker-registry" exposed $ docker login -u developer -p `oc whoami -t` http://docker-registry-default.127.0.0.1.nip.io:80/ Login Succeeded $ docker tag alpine:latest docker-registry-default.127.0.0.1.nip.io:80/myproject/alpine $ docker push docker-registry-default.127.0.0.1.nip.io:80/myproject/alpine The push refers to a repository [docker-registry-default.127.0.0.1.nip.io:80/myproject/alpine] 5bef08742407: Layer already exists latest: digest: sha256:471fd6e70d36b9c221f76464d0a9ff78392ccee359da351ebfec45138fb40f9b size: 528 $ oc get is NAME DOCKER REPO TAGS UPDATED alpine 172.30.1.1:5000/myproject/alpine latest 10 seconds ago