[19.03 backport] builder-next: userns remap support and honor daemon's DNS config
Andrew Hsu authored on 2019/08/09 05:35:34... | ... |
@@ -26,9 +26,10 @@ var keySize = []byte("size") |
26 | 26 |
|
27 | 27 |
// Opt defines options for creating the snapshotter |
28 | 28 |
type Opt struct { |
29 |
- GraphDriver graphdriver.Driver |
|
30 |
- LayerStore layer.Store |
|
31 |
- Root string |
|
29 |
+ GraphDriver graphdriver.Driver |
|
30 |
+ LayerStore layer.Store |
|
31 |
+ Root string |
|
32 |
+ IdentityMapping *idtools.IdentityMapping |
|
32 | 33 |
} |
33 | 34 |
|
34 | 35 |
type graphIDRegistrar interface { |
... | ... |
@@ -79,7 +80,7 @@ func (s *snapshotter) Name() string { |
79 | 79 |
} |
80 | 80 |
|
81 | 81 |
func (s *snapshotter) IdentityMapping() *idtools.IdentityMapping { |
82 |
- return nil |
|
82 |
+ return s.opt.IdentityMapping |
|
83 | 83 |
} |
84 | 84 |
|
85 | 85 |
func (s *snapshotter) Prepare(ctx context.Context, key, parent string, opts ...snapshots.Opt) error { |
... | ... |
@@ -253,6 +254,7 @@ func (s *snapshotter) Mounts(ctx context.Context, key string) (snapshot.Mountabl |
253 | 253 |
id := identity.NewID() |
254 | 254 |
var rwlayer layer.RWLayer |
255 | 255 |
return &mountable{ |
256 |
+ idmap: s.opt.IdentityMapping, |
|
256 | 257 |
acquire: func() ([]mount.Mount, error) { |
257 | 258 |
rwlayer, err = s.opt.LayerStore.CreateRWLayer(id, l.ChainID(), nil) |
258 | 259 |
if err != nil { |
... | ... |
@@ -278,6 +280,7 @@ func (s *snapshotter) Mounts(ctx context.Context, key string) (snapshot.Mountabl |
278 | 278 |
id, _ := s.getGraphDriverID(key) |
279 | 279 |
|
280 | 280 |
return &mountable{ |
281 |
+ idmap: s.opt.IdentityMapping, |
|
281 | 282 |
acquire: func() ([]mount.Mount, error) { |
282 | 283 |
rootfs, err := s.opt.GraphDriver.Get(id, "") |
283 | 284 |
if err != nil { |
... | ... |
@@ -440,6 +443,7 @@ type mountable struct { |
440 | 440 |
acquire func() ([]mount.Mount, error) |
441 | 441 |
release func() error |
442 | 442 |
refCount int |
443 |
+ idmap *idtools.IdentityMapping |
|
443 | 444 |
} |
444 | 445 |
|
445 | 446 |
func (m *mountable) Mount() ([]mount.Mount, error) { |
... | ... |
@@ -480,5 +484,5 @@ func (m *mountable) Release() error { |
480 | 480 |
} |
481 | 481 |
|
482 | 482 |
func (m *mountable) IdentityMapping() *idtools.IdentityMapping { |
483 |
- return nil |
|
483 |
+ return m.idmap |
|
484 | 484 |
} |
... | ... |
@@ -17,6 +17,7 @@ import ( |
17 | 17 |
"github.com/docker/docker/builder" |
18 | 18 |
"github.com/docker/docker/daemon/config" |
19 | 19 |
"github.com/docker/docker/daemon/images" |
20 |
+ "github.com/docker/docker/pkg/idtools" |
|
20 | 21 |
"github.com/docker/docker/pkg/streamformatter" |
21 | 22 |
"github.com/docker/docker/pkg/system" |
22 | 23 |
"github.com/docker/libnetwork" |
... | ... |
@@ -73,6 +74,8 @@ type Opt struct { |
73 | 73 |
ResolverOpt resolver.ResolveOptionsFunc |
74 | 74 |
BuilderConfig config.BuilderConfig |
75 | 75 |
Rootless bool |
76 |
+ IdentityMapping *idtools.IdentityMapping |
|
77 |
+ DNSConfig config.DNSConfig |
|
76 | 78 |
} |
77 | 79 |
|
78 | 80 |
// Builder can build using BuildKit backend |
... | ... |
@@ -88,6 +91,10 @@ type Builder struct { |
88 | 88 |
func New(opt Opt) (*Builder, error) { |
89 | 89 |
reqHandler := newReqBodyHandler(tracing.DefaultTransport) |
90 | 90 |
|
91 |
+ if opt.IdentityMapping != nil && opt.IdentityMapping.Empty() { |
|
92 |
+ opt.IdentityMapping = nil |
|
93 |
+ } |
|
94 |
+ |
|
91 | 95 |
c, err := newController(reqHandler, opt) |
92 | 96 |
if err != nil { |
93 | 97 |
return nil, err |
... | ... |
@@ -38,7 +38,7 @@ import ( |
38 | 38 |
) |
39 | 39 |
|
40 | 40 |
func newController(rt http.RoundTripper, opt Opt) (*control.Controller, error) { |
41 |
- if err := os.MkdirAll(opt.Root, 0700); err != nil { |
|
41 |
+ if err := os.MkdirAll(opt.Root, 0711); err != nil { |
|
42 | 42 |
return nil, err |
43 | 43 |
} |
44 | 44 |
|
... | ... |
@@ -55,9 +55,10 @@ func newController(rt http.RoundTripper, opt Opt) (*control.Controller, error) { |
55 | 55 |
} |
56 | 56 |
|
57 | 57 |
sbase, err := snapshot.NewSnapshotter(snapshot.Opt{ |
58 |
- GraphDriver: driver, |
|
59 |
- LayerStore: dist.LayerStore, |
|
60 |
- Root: root, |
|
58 |
+ GraphDriver: driver, |
|
59 |
+ LayerStore: dist.LayerStore, |
|
60 |
+ Root: root, |
|
61 |
+ IdentityMapping: opt.IdentityMapping, |
|
61 | 62 |
}) |
62 | 63 |
if err != nil { |
63 | 64 |
return nil, err |
... | ... |
@@ -112,7 +113,9 @@ func newController(rt http.RoundTripper, opt Opt) (*control.Controller, error) { |
112 | 112 |
return nil, err |
113 | 113 |
} |
114 | 114 |
|
115 |
- exec, err := newExecutor(root, opt.DefaultCgroupParent, opt.NetworkController, opt.Rootless) |
|
115 |
+ dns := getDNSConfig(opt.DNSConfig) |
|
116 |
+ |
|
117 |
+ exec, err := newExecutor(root, opt.DefaultCgroupParent, opt.NetworkController, dns, opt.Rootless, opt.IdentityMapping) |
|
116 | 118 |
if err != nil { |
117 | 119 |
return nil, err |
118 | 120 |
} |
... | ... |
@@ -8,8 +8,11 @@ import ( |
8 | 8 |
"strconv" |
9 | 9 |
"sync" |
10 | 10 |
|
11 |
+ "github.com/docker/docker/daemon/config" |
|
12 |
+ "github.com/docker/docker/pkg/idtools" |
|
11 | 13 |
"github.com/docker/libnetwork" |
12 | 14 |
"github.com/moby/buildkit/executor" |
15 |
+ "github.com/moby/buildkit/executor/oci" |
|
13 | 16 |
"github.com/moby/buildkit/executor/runcexecutor" |
14 | 17 |
"github.com/moby/buildkit/identity" |
15 | 18 |
"github.com/moby/buildkit/solver/pb" |
... | ... |
@@ -20,7 +23,7 @@ import ( |
20 | 20 |
|
21 | 21 |
const networkName = "bridge" |
22 | 22 |
|
23 |
-func newExecutor(root, cgroupParent string, net libnetwork.NetworkController, rootless bool) (executor.Executor, error) { |
|
23 |
+func newExecutor(root, cgroupParent string, net libnetwork.NetworkController, dnsConfig *oci.DNSConfig, rootless bool, idmap *idtools.IdentityMapping) (executor.Executor, error) { |
|
24 | 24 |
networkProviders := map[pb.NetMode]network.Provider{ |
25 | 25 |
pb.NetMode_UNSET: &bridgeProvider{NetworkController: net, Root: filepath.Join(root, "net")}, |
26 | 26 |
pb.NetMode_HOST: network.NewHostProvider(), |
... | ... |
@@ -32,6 +35,8 @@ func newExecutor(root, cgroupParent string, net libnetwork.NetworkController, ro |
32 | 32 |
DefaultCgroupParent: cgroupParent, |
33 | 33 |
Rootless: rootless, |
34 | 34 |
NoPivot: os.Getenv("DOCKER_RAMDISK") != "", |
35 |
+ IdentityMapping: idmap, |
|
36 |
+ DNS: dnsConfig, |
|
35 | 37 |
}, networkProviders) |
36 | 38 |
} |
37 | 39 |
|
... | ... |
@@ -115,3 +120,14 @@ func (iface *lnInterface) Close() error { |
115 | 115 |
} |
116 | 116 |
return iface.err |
117 | 117 |
} |
118 |
+ |
|
119 |
+func getDNSConfig(cfg config.DNSConfig) *oci.DNSConfig { |
|
120 |
+ if cfg.DNS != nil || cfg.DNSSearch != nil || cfg.DNSOptions != nil { |
|
121 |
+ return &oci.DNSConfig{ |
|
122 |
+ Nameservers: cfg.DNS, |
|
123 |
+ SearchDomains: cfg.DNSSearch, |
|
124 |
+ Options: cfg.DNSOptions, |
|
125 |
+ } |
|
126 |
+ } |
|
127 |
+ return nil |
|
128 |
+} |
... | ... |
@@ -5,12 +5,15 @@ import ( |
5 | 5 |
"errors" |
6 | 6 |
"io" |
7 | 7 |
|
8 |
+ "github.com/docker/docker/daemon/config" |
|
9 |
+ "github.com/docker/docker/pkg/idtools" |
|
8 | 10 |
"github.com/docker/libnetwork" |
9 | 11 |
"github.com/moby/buildkit/cache" |
10 | 12 |
"github.com/moby/buildkit/executor" |
13 |
+ "github.com/moby/buildkit/executor/oci" |
|
11 | 14 |
) |
12 | 15 |
|
13 |
-func newExecutor(_, _ string, _ libnetwork.NetworkController, _ bool) (executor.Executor, error) { |
|
16 |
+func newExecutor(_, _ string, _ libnetwork.NetworkController, _ *oci.DNSConfig, _ bool, _ *idtools.IdentityMapping) (executor.Executor, error) { |
|
14 | 17 |
return &winExecutor{}, nil |
15 | 18 |
} |
16 | 19 |
|
... | ... |
@@ -20,3 +23,7 @@ type winExecutor struct { |
20 | 20 |
func (e *winExecutor) Exec(ctx context.Context, meta executor.Meta, rootfs cache.Mountable, mounts []executor.Mount, stdin io.ReadCloser, stdout, stderr io.WriteCloser) error { |
21 | 21 |
return errors.New("buildkit executor not implemented for windows") |
22 | 22 |
} |
23 |
+ |
|
24 |
+func getDNSConfig(config.DNSConfig) *oci.DNSConfig { |
|
25 |
+ return nil |
|
26 |
+} |
... | ... |
@@ -318,6 +318,8 @@ func newRouterOptions(config *config.Config, d *daemon.Daemon) (routerOptions, e |
318 | 318 |
ResolverOpt: d.NewResolveOptionsFunc(), |
319 | 319 |
BuilderConfig: config.Builder, |
320 | 320 |
Rootless: d.Rootless(), |
321 |
+ IdentityMapping: d.IdentityMapping(), |
|
322 |
+ DNSConfig: config.DNSConfig, |
|
321 | 323 |
}) |
322 | 324 |
if err != nil { |
323 | 325 |
return opts, err |
... | ... |
@@ -109,6 +109,13 @@ type CommonTLSOptions struct { |
109 | 109 |
KeyFile string `json:"tlskey,omitempty"` |
110 | 110 |
} |
111 | 111 |
|
112 |
+// DNSConfig defines the DNS configurations. |
|
113 |
+type DNSConfig struct { |
|
114 |
+ DNS []string `json:"dns,omitempty"` |
|
115 |
+ DNSOptions []string `json:"dns-opts,omitempty"` |
|
116 |
+ DNSSearch []string `json:"dns-search,omitempty"` |
|
117 |
+} |
|
118 |
+ |
|
112 | 119 |
// CommonConfig defines the configuration of a docker daemon which is |
113 | 120 |
// common across platforms. |
114 | 121 |
// It includes json tags to deserialize configuration from a file |
... | ... |
@@ -119,9 +126,6 @@ type CommonConfig struct { |
119 | 119 |
AutoRestart bool `json:"-"` |
120 | 120 |
Context map[string][]string `json:"-"` |
121 | 121 |
DisableBridge bool `json:"-"` |
122 |
- DNS []string `json:"dns,omitempty"` |
|
123 |
- DNSOptions []string `json:"dns-opts,omitempty"` |
|
124 |
- DNSSearch []string `json:"dns-search,omitempty"` |
|
125 | 122 |
ExecOptions []string `json:"exec-opts,omitempty"` |
126 | 123 |
GraphDriver string `json:"storage-driver,omitempty"` |
127 | 124 |
GraphOptions []string `json:"storage-opts,omitempty"` |
... | ... |
@@ -200,6 +204,7 @@ type CommonConfig struct { |
200 | 200 |
|
201 | 201 |
MetricsAddress string `json:"metrics-addr"` |
202 | 202 |
|
203 |
+ DNSConfig |
|
203 | 204 |
LogConfig |
204 | 205 |
BridgeConfig // bridgeConfig holds bridge network specific configuration. |
205 | 206 |
NetworkConfig |
... | ... |
@@ -244,28 +244,36 @@ func TestValidateConfigurationErrors(t *testing.T) { |
244 | 244 |
{ |
245 | 245 |
config: &Config{ |
246 | 246 |
CommonConfig: CommonConfig{ |
247 |
- DNS: []string{"1.1.1.1o"}, |
|
247 |
+ DNSConfig: DNSConfig{ |
|
248 |
+ DNS: []string{"1.1.1.1o"}, |
|
249 |
+ }, |
|
248 | 250 |
}, |
249 | 251 |
}, |
250 | 252 |
}, |
251 | 253 |
{ |
252 | 254 |
config: &Config{ |
253 | 255 |
CommonConfig: CommonConfig{ |
254 |
- DNS: []string{"2.2.2.2", "1.1.1.1o"}, |
|
256 |
+ DNSConfig: DNSConfig{ |
|
257 |
+ DNS: []string{"2.2.2.2", "1.1.1.1o"}, |
|
258 |
+ }, |
|
255 | 259 |
}, |
256 | 260 |
}, |
257 | 261 |
}, |
258 | 262 |
{ |
259 | 263 |
config: &Config{ |
260 | 264 |
CommonConfig: CommonConfig{ |
261 |
- DNSSearch: []string{"123456"}, |
|
265 |
+ DNSConfig: DNSConfig{ |
|
266 |
+ DNSSearch: []string{"123456"}, |
|
267 |
+ }, |
|
262 | 268 |
}, |
263 | 269 |
}, |
264 | 270 |
}, |
265 | 271 |
{ |
266 | 272 |
config: &Config{ |
267 | 273 |
CommonConfig: CommonConfig{ |
268 |
- DNSSearch: []string{"a.b.c", "123456"}, |
|
274 |
+ DNSConfig: DNSConfig{ |
|
275 |
+ DNSSearch: []string{"a.b.c", "123456"}, |
|
276 |
+ }, |
|
269 | 277 |
}, |
270 | 278 |
}, |
271 | 279 |
}, |
... | ... |
@@ -329,14 +337,18 @@ func TestValidateConfiguration(t *testing.T) { |
329 | 329 |
{ |
330 | 330 |
config: &Config{ |
331 | 331 |
CommonConfig: CommonConfig{ |
332 |
- DNS: []string{"1.1.1.1"}, |
|
332 |
+ DNSConfig: DNSConfig{ |
|
333 |
+ DNS: []string{"1.1.1.1"}, |
|
334 |
+ }, |
|
333 | 335 |
}, |
334 | 336 |
}, |
335 | 337 |
}, |
336 | 338 |
{ |
337 | 339 |
config: &Config{ |
338 | 340 |
CommonConfig: CommonConfig{ |
339 |
- DNSSearch: []string{"a.b.c"}, |
|
341 |
+ DNSConfig: DNSConfig{ |
|
342 |
+ DNSSearch: []string{"a.b.c"}, |
|
343 |
+ }, |
|
340 | 344 |
}, |
341 | 345 |
}, |
342 | 346 |
}, |
0 | 1 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,77 @@ |
0 |
+module github.com/moby/buildkit |
|
1 |
+ |
|
2 |
+go 1.11 |
|
3 |
+ |
|
4 |
+require ( |
|
5 |
+ github.com/BurntSushi/toml v0.3.1 |
|
6 |
+ github.com/Microsoft/go-winio v0.4.13-0.20190408173621-84b4ab48a507 |
|
7 |
+ github.com/apache/thrift v0.0.0-20161221203622-b2a4d4ae21c7 // indirect |
|
8 |
+ github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58 // indirect |
|
9 |
+ github.com/containerd/cgroups v0.0.0-20190226200435-dbea6f2bd416 // indirect |
|
10 |
+ github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50 |
|
11 |
+ github.com/containerd/containerd v1.3.0-0.20190507210959-7c1e88399ec0 |
|
12 |
+ github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc |
|
13 |
+ github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260 // indirect |
|
14 |
+ github.com/containerd/go-cni v0.0.0-20190610170741-5a4663dad645 |
|
15 |
+ github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3 |
|
16 |
+ github.com/containerd/ttrpc v0.0.0-20190411181408-699c4e40d1e7 // indirect |
|
17 |
+ github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd // indirect |
|
18 |
+ github.com/containernetworking/cni v0.6.1-0.20180218032124-142cde0c766c // indirect |
|
19 |
+ github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e |
|
20 |
+ github.com/docker/cli v0.0.0-20190321234815-f40f9c240ab0 |
|
21 |
+ github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible |
|
22 |
+ github.com/docker/docker v1.14.0-0.20190319215453-e7b5f7dbe98c |
|
23 |
+ github.com/docker/docker-credential-helpers v0.6.0 // indirect |
|
24 |
+ github.com/docker/go-connections v0.3.0 |
|
25 |
+ github.com/docker/go-events v0.0.0-20170721190031-9461782956ad // indirect |
|
26 |
+ github.com/docker/libnetwork v0.8.0-dev.2.0.20190604151032-3c26b4e7495e |
|
27 |
+ github.com/godbus/dbus v4.1.0+incompatible // indirect |
|
28 |
+ github.com/gofrs/flock v0.7.0 |
|
29 |
+ github.com/gogo/googleapis v1.1.0 |
|
30 |
+ github.com/gogo/protobuf v1.2.0 |
|
31 |
+ github.com/golang/protobuf v1.2.0 |
|
32 |
+ github.com/google/go-cmp v0.2.0 |
|
33 |
+ github.com/google/shlex v0.0.0-20150127133951-6f45313302b9 |
|
34 |
+ github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 |
|
35 |
+ github.com/hashicorp/go-immutable-radix v1.0.0 |
|
36 |
+ github.com/hashicorp/golang-lru v0.0.0-20160207214719-a0d98a5f2880 |
|
37 |
+ github.com/hashicorp/uuid v0.0.0-20160311170451-ebb0a03e909c // indirect |
|
38 |
+ github.com/ishidawataru/sctp v0.0.0-20180213033435-07191f837fed // indirect |
|
39 |
+ github.com/jaguilar/vt100 v0.0.0-20150826170717-2703a27b14ea |
|
40 |
+ github.com/kr/pretty v0.1.0 // indirect |
|
41 |
+ github.com/mitchellh/hashstructure v0.0.0-20170609045927-2bca23e0e452 |
|
42 |
+ github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c |
|
43 |
+ github.com/opencontainers/go-digest v1.0.0-rc1 |
|
44 |
+ github.com/opencontainers/image-spec v1.0.1 |
|
45 |
+ github.com/opencontainers/runc v1.0.0-rc8 |
|
46 |
+ github.com/opencontainers/runtime-spec v0.0.0-20180909173843-eba862dc2470 |
|
47 |
+ github.com/opentracing-contrib/go-stdlib v0.0.0-20171029140428-b1a47cfbdd75 |
|
48 |
+ github.com/opentracing/opentracing-go v0.0.0-20171003133519-1361b9cd60be |
|
49 |
+ github.com/pkg/errors v0.8.1 |
|
50 |
+ github.com/pkg/profile v1.2.1 |
|
51 |
+ github.com/serialx/hashring v0.0.0-20190422032157-8b2912629002 |
|
52 |
+ github.com/sirupsen/logrus v1.3.0 |
|
53 |
+ github.com/stretchr/testify v1.3.0 |
|
54 |
+ github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2 // indirect |
|
55 |
+ github.com/tonistiigi/fsutil v0.0.0-20190327153851-3bbb99cdbd76 |
|
56 |
+ github.com/tonistiigi/units v0.0.0-20180711220420-6950e57a87ea |
|
57 |
+ github.com/uber/jaeger-client-go v0.0.0-20180103221425-e02c85f9069e |
|
58 |
+ github.com/uber/jaeger-lib v1.2.1 // indirect |
|
59 |
+ github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5 |
|
60 |
+ github.com/vishvananda/netlink v1.0.0 // indirect |
|
61 |
+ github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc // indirect |
|
62 |
+ go.etcd.io/bbolt v1.3.2 |
|
63 |
+ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 |
|
64 |
+ golang.org/x/net v0.0.0-20190311183353-d8887717615a |
|
65 |
+ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f |
|
66 |
+ golang.org/x/sys v0.0.0-20190303122642-d455e41777fc |
|
67 |
+ golang.org/x/time v0.0.0-20161028155119-f51c12702a4d |
|
68 |
+ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 |
|
69 |
+ google.golang.org/grpc v1.20.1 |
|
70 |
+ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect |
|
71 |
+ gotest.tools v2.2.0+incompatible |
|
72 |
+) |
|
73 |
+ |
|
74 |
+replace github.com/hashicorp/go-immutable-radix => github.com/tonistiigi/go-immutable-radix v0.0.0-20170803185627-826af9ccf0fe |
|
75 |
+ |
|
76 |
+replace github.com/jaguilar/vt100 => github.com/tonistiigi/vt100 v0.0.0-20190402012908-ad4c4a574305 |
0 | 77 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,10 @@ |
0 |
+module github.com/sirupsen/logrus |
|
1 |
+ |
|
2 |
+require ( |
|
3 |
+ github.com/davecgh/go-spew v1.1.1 // indirect |
|
4 |
+ github.com/konsorten/go-windows-terminal-sequences v1.0.1 |
|
5 |
+ github.com/pmezard/go-difflib v1.0.0 // indirect |
|
6 |
+ github.com/stretchr/objx v0.1.1 // indirect |
|
7 |
+ github.com/stretchr/testify v1.2.2 |
|
8 |
+ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33 |
|
9 |
+) |
0 | 10 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,28 @@ |
0 |
+module github.com/tonistiigi/fsutil |
|
1 |
+ |
|
2 |
+require ( |
|
3 |
+ github.com/Microsoft/go-winio v0.4.11 // indirect |
|
4 |
+ github.com/Microsoft/hcsshim v0.8.5 // indirect |
|
5 |
+ github.com/containerd/containerd v1.2.4 |
|
6 |
+ github.com/containerd/continuity v0.0.0-20181001140422-bd77b46c8352 |
|
7 |
+ github.com/davecgh/go-spew v1.1.1 // indirect |
|
8 |
+ github.com/docker/docker v0.0.0-20180531152204-71cd53e4a197 |
|
9 |
+ github.com/docker/go-units v0.3.1 // indirect |
|
10 |
+ github.com/gogo/protobuf v1.0.0 |
|
11 |
+ github.com/google/go-cmp v0.2.0 // indirect |
|
12 |
+ github.com/gotestyourself/gotestyourself v2.2.0+incompatible // indirect |
|
13 |
+ github.com/onsi/ginkgo v1.7.0 // indirect |
|
14 |
+ github.com/onsi/gomega v1.4.3 // indirect |
|
15 |
+ github.com/opencontainers/go-digest v1.0.0-rc1 |
|
16 |
+ github.com/opencontainers/image-spec v1.0.1 // indirect |
|
17 |
+ github.com/opencontainers/runc v1.0.0-rc6 // indirect |
|
18 |
+ github.com/pkg/errors v0.8.1 |
|
19 |
+ github.com/sirupsen/logrus v1.0.3 // indirect |
|
20 |
+ github.com/stretchr/testify v1.3.0 |
|
21 |
+ golang.org/x/crypto v0.0.0-20190129210102-0709b304e793 // indirect |
|
22 |
+ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f |
|
23 |
+ golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e |
|
24 |
+ gopkg.in/airbrake/gobrake.v2 v2.0.9 // indirect |
|
25 |
+ gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 // indirect |
|
26 |
+ gotest.tools v2.1.0+incompatible // indirect |
|
27 |
+) |
0 | 3 |
new file mode 100644 |
... | ... |
@@ -0,0 +1,19 @@ |
0 |
+module google.golang.org/grpc |
|
1 |
+ |
|
2 |
+require ( |
|
3 |
+ cloud.google.com/go v0.26.0 // indirect |
|
4 |
+ github.com/BurntSushi/toml v0.3.1 // indirect |
|
5 |
+ github.com/client9/misspell v0.3.4 |
|
6 |
+ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b |
|
7 |
+ github.com/golang/mock v1.1.1 |
|
8 |
+ github.com/golang/protobuf v1.2.0 |
|
9 |
+ golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 |
|
10 |
+ golang.org/x/net v0.0.0-20190311183353-d8887717615a |
|
11 |
+ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be |
|
12 |
+ golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f // indirect |
|
13 |
+ golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a |
|
14 |
+ golang.org/x/tools v0.0.0-20190311212946-11955173bddd |
|
15 |
+ google.golang.org/appengine v1.1.0 // indirect |
|
16 |
+ google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8 |
|
17 |
+ honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099 |
|
18 |
+) |