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

8
目标是将我的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: ""

我知道使用Alpine操作系统运行将不会得到任何有趣的结果。无论我尝试推送哪个镜像,结果都是一样的。登录似乎实际上是有效的。如果我删除或更改令牌的任何部分,则登录会失败。我正在运行的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
2个回答

4
你可以像Graham在上面指出的那样暴露注册表,但这不是必需的。
在您使用内部IP的情况下,docker push命令docker push 172.30.1.1:5000/alpine:latest是不正确的。无论是外部路由还是内部IP,基于图像名称空间和名称的内部注册表都将为您创建适当的镜像流。镜像流的名称和命名空间/项目取自推送。这意味着您需要确保使用3个元素标记图像:
- docker注册表IP和端口(外部路由或内部IP) - 命名空间/项目,您的用户可以访问(在oc cluster up的情况下,myproject是您的用户可以访问的默认项目) - 最后是图像流名称
在您的情况下,docker push应该如下所示:docker push 172.30.1.1:5000/myproject/alpine:latest

4

在尝试推送Docker镜像时,可能会出现几个问题。

在此之前,通常公开内部镜像注册表的方法是使用路由进行公开。由于仅使用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/

在登录时,请确保在URL中使用:80。如果内部图像注册表是通过安全路由公开的,则应使用:443而不是:80

接下来,您需要对图像进行标记,但要小心选择标记内容,因为您需要包含应将图像流添加到其中的项目名称。

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

请看我如何在标签中包含 myproject,因为这是我想要它最终出现的项目。
详见: 再次使用:80作为端口的名称。即使给出了http,登录时也需要在URL中输入该端口,这可能是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

请注意,当部署到远程 OpenShift 集群时,您可能需要在本地 Docker 守护程序中将注册表配置为“不安全的注册表”。例如,在 Docker for OS X 上,您需要转到“首选项”->“守护程序”->“基本设置”进行配置。 - Gunnar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接