目标是能够在我的笔记本电脑上获取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
答案 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个元素标记图像:
oc cluster up
myproject
是您的用户有权访问的默认名称)在您的情况下,泊坞窗推送应如下所示:docker push 172.30.1.1:5000/myproject/alpine:latest
。