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
動かそうとしたソースコード
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に依存しないようにしたいらしい)
一時的な回避方法。
とりあえずParseDockerRef()が存在しているリビジョンを指定してgo.modに追加
これを消して
github.com/docker/distribution v2.7.1+incompatible // indirect
これを追加
github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible // indirect