docker run 注册表错误 301 响应缺少位置 header

标签 docker docker-registry

我收到以下错误(请参阅下面的执行命令):

DEBU[0000] using "text" logging formatter               
panic: Get : 301 response missing Location header

goroutine 1 [running]:
github.com/docker/distribution/registry/handlers.NewApp(0x7f5f7ba3eab8, 0xc2080cf1a0, 0xc20802b8a0, 0x3, 0xc20802b8d8, 0x5, 0xc20802b908, 0x4, 0xc2080ce720, 0xa5e630, ...)
    /go/src/github.com/docker/distribution/registry/handlers/app.go:81 +0x5eb
main.main()
    /go/src/github.com/docker/distribution/cmd/registry/main.go:62 +0x439

goroutine 6 [syscall]:
os/signal.loop()
    /usr/src/go/src/os/signal/signal_unix.go:21 +0x1f
created by os/signal.init·1
    /usr/src/go/src/os/signal/signal_unix.go:27 +0x35

goroutine 10 [runnable]:
net/http.(*persistConn).readLoop(0xc20809d6b0)
    /usr/src/go/src/net/http/transport.go:928 +0x9ce
created by net/http.(*Transport).dialConn
    /usr/src/go/src/net/http/transport.go:660 +0xc9f

goroutine 17 [syscall, locked to thread]:
runtime.goexit()
    /usr/src/go/src/runtime/asm_amd64.s:2232 +0x1

goroutine 11 [select]:
net/http.(*persistConn).writeLoop(0xc20809d6b0)
    /usr/src/go/src/net/http/transport.go:945 +0x41d
created by net/http.(*Transport).dialConn
    /usr/src/go/src/net/http/transport.go:661 +0xcbc

我按如下方式启动 docker 注册表:

docker run \
  --rm -it \
  --env="REGISTRY_STORAGE_S3_ACCESSKEY=SECRET_KEY" \
  --env="REGISTRY_STORAGE_S3_SECRETKEY=ACCESS_KEY" \
  --env="REGISTRY_STORAGE_S3_BUCKET=bucket" \
  --env="REGISTRY_HTTP_TLS_CERTIFICATE=/go/src/github.com/docker/distribution/certs/domain.crt" \
  --env="REGISTRY_HTTP_TLS_KEY=/go/src/github.com/docker/distribution/certs/domain.key" \
  --env="REGISTRY_HTTP_ADDR=localhost:5000" \
  --name="registry" \
  --publish="5000:5000" \
  --volume="/sandbox/docker/certs:/go/src/github.com/docker/distribution/certs" \
  --volume="/sandbox/docker/registry/config.yml:/go/src/github.com/docker/distribution/cmd/registry/config.yml" \
  distribution/registry cmd/registry/config.yml

出于安全原因,其中 REGISTRY_STORAGE_S3_ACCESSKEYREGISTRY_STORAGE_S3_SECRETKEYREGISTRY_STORAGE_S3_BUCKET 保留虚拟值。我可以使用它们从所需的 s3 存储桶中写入\读取。

这里有一些更多信息:

$ docker info
Containers: 0
Images: 109
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 109
 Dirperm1 Supported: false
Execution Driver: native-0.2
Kernel Version: 3.13.0-53-generic
Operating System: Ubuntu 14.04.2 LTS
CPUs: 4
Total Memory: 15.54 GiB
Name: heaven
ID: REMOVED_FOR_SECURITY_REASONS
WARNING: No swap limit support

目录结构:

$ ls -R /sandbox/docker
/sandbox/docker/certs:
domain.crt
domain.key

/sandbox/docker/registry:
config.yml

我的config.yml文件:

$ cat /sandbox/docker/registry/config.yml
version: 0.1
log:
    level: debug
    formatter: text
    fields:
        service: registry
        environment: prod
storage:
    s3:
        accesskey: awsaccesskey
        secretkey: awssecretkey
        region: us-west-1
        bucket: bucket
        encrypt: true
        secure: true
        v4auth: true
        chunksize: 5242880
        rootdirectory: /s3/object/name/prefix
    cache:
        layerinfo: inmemory
auth:
    token:
        realm: token-realm
        service: token-service
        issuer: registry-token-issuer
        rootcertbundle: /root/certs/bundle
http:
    addr: localhost:5000
    secret: myspecialsecret
    tls:
        certificate: /go/src/github.com/docker/distribution/certs/domain.crt
        key: /go/src/github.com/docker/distribution/certs/domain.key
    debug:
        addr: localhost:5001

认证文件:

$ grep -r "^----" /sandbox/docker/certs/
/sandbox/docker/certs/domain.crt:-----BEGIN CERTIFICATE-----
/sandbox/docker/certs/domain.crt:-----END CERTIFICATE-----
/sandbox/docker/certs/domain.crt:-----BEGIN CERTIFICATE-----
/sandbox/docker/certs/domain.crt:-----END CERTIFICATE-----
/sandbox/docker/certs/domain.key:-----BEGIN CERTIFICATE-----
/sandbox/docker/certs/domain.key:-----END CERTIFICATE-----

其中 domain.crt 还包含中间证书(在底部连接)。

谁能指出问题所在吗?

我知道我可以构建一个新的注册表镜像,如docker docs所示,但我只想使用 docker run 来完成此操作,而不使用 docker build

最佳答案

当配置文件中指定了错误的 S3 区域时,就会发生这种情况。请参阅此处的类似报告:https://github.com/docker/distribution/issues/854

关于docker run 注册表错误 301 响应缺少位置 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30413863/

相关文章:

session - 在 docker 镜像中获取所有打开的连接

docker - Docker Swarm领事未启动

docker - 我可以在 Docker Private Repository 中存储多少个 docker 镜像

docker - 我可以在不下载图像的情况下获得图像摘要吗?

docker-registry磁盘已满,没有节食的想法

docker - 在构建 Dockerfile 时,是否有比在命令行上重复 --build-arg 更好的方法?

docker - 柑橘框架:如何等待容器健康?

docker - Dockerfile:如何获取Anaconda

git - 共享 Dockerfile 和 Docker 镜像之间的区别?

docker - kubectl create deployment 无法从本地 docker repo 连接中拉取镜像被拒绝