containerd1.3.6でgo mod起因によるundedinedエラーが発生する場合における一時的なエラー回避方法

TL;DR

このエラーは

# github.com/containerd/containerd/images/archive
../../../pkg/mod/github.com/containerd/containerd@v1.3.6/images/archive/reference.go:73:21: undefined: "github.com/docker/distribution/reference".ParseDockerRef

これを消して

github.com/docker/distribution v2.7.1+incompatible // indirect

これを追加

github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible // indirect

動かそうとしたソースコード

containerdのチュートリアルにあるソースコード

package main

import (
    "context"
    "log"

    "github.com/containerd/containerd"
    "github.com/containerd/containerd/namespaces"
)

func main() {
    if err := redisExample(); err != nil {
        log.Fatal(err)
    }
}

func redisExample() error {
    client, err := containerd.New("/run/containerd/containerd.sock")
    if err != nil {
        return err
    }
    defer client.Close()

    ctx := namespaces.WithNamespace(context.Background(), "example")
    image, err := client.Pull(ctx, "docker.io/library/redis:alpine", containerd.WithPullUnpack)
    if err != nil {
        return err
    }
    log.Printf("Successfully pulled %s image\n", image.Name())

    return nil
}

事象

ビルド時に以下のエラーが発生

# github.com/containerd/containerd/images/archive
../../../pkg/mod/github.com/containerd/containerd@v1.3.6/images/archive/reference.go:73:21: undefined: "github.com/docker/distribution/reference".ParseDockerRef

原因

import (
    "strings"

    "github.com/containerd/containerd/reference"
    distref "github.com/docker/distribution/reference" // 
    "github.com/opencontainers/go-digest"
    "github.com/pkg/errors"
)

func normalizeReference(ref string) (string, error) {
    // TODO: Replace this function to not depend on reference package
    normalized, err := distref.ParseDockerRef(ref)
    if err != nil {
        return "", errors.Wrapf(err, "normalize image ref %q", ref)
    }

    return normalized.String(), nil
}

確かに、distref.ParseDockerRef(ref)は存在しなかった (そして意味深なTODO、、、、reference packageに依存しないようにしたいらしい)

github.com

一時的な回避方法。

とりあえずParseDockerRef()が存在しているリビジョンを指定してgo.modに追加

これを消して

github.com/docker/distribution v2.7.1+incompatible // indirect

これを追加

github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible // indirect