无法将docker镜像推送到本地OpenShift Origin注册表

时间:2017-08-10 23:41:29

标签: docker openshift-origin

目标是能够在我的笔记本电脑上获取Docker镜像并将其推送到OpenShift Origin图像注册表(由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: ""

我知道跑阿尔卑斯不会产生任何有趣的东西。无论我试图推送什么图像,结果都是一样的。登录似乎确实有效。如果我删除或更改令牌的任何部分,登录将失败。 Docker I的版本正在运行:

# 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

2 个答案:

答案 0 :(得分:4)

尝试推送泊坞窗图像时可能会影响一些问题。

在我们开始之前,通常允许访问内部图像注册表的方法是使用路径公开它。由于您使用的IP仅适用于oc cluster up,因此将显示如何使用路由,这种方式更通用。

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

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

这将为内部图像注册表创建一个URL:

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

接下来使用以下方式登录内部图像注册表:

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

确保在登录时在网址中使用:80。如果使用安全路由公开内部图像注册表,则使用:443代替:80

接下来,您要标记图像,但要注意标记图像,因为您要包含应添加图像流的项目名称。

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

了解我在标记中包含myproject的方式,因为这是我希望它最终完成的项目。

详细信息:

再次使用:80作为名称中的端口。登录时需要URL中的端口,即使给出http,也可能是3.6.0或docker命令行客户端中的错误。他们目前在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

答案 1 :(得分:3)

你可以像Graham上面指出的那样公开注册表,但这不是必需的。

在使用内部IP时,docker push命令docker push 172.30.1.1:5000/alpine:latest不正确。 在任何一种情况下(外部路由或内部IP),内部注册表(基于图像命名空间和名称)将为您创建适当的图像流。图像流的名称和它的名称空间/项目取自推送。这意味着您需要确保使用3个元素标记图像:

  • docker注册表IP和端口(外部路由或内部IP)
  • 您的用户有权访问的名称空间/项目(如果oc cluster up myproject是您的用户有权访问的默认名称)
  • 最后是图像流名称

在您的情况下,泊坞窗推送应如下所示:docker push 172.30.1.1:5000/myproject/alpine:latest

相关问题