зеркало из https://github.com/docker/hub-tool.git
Merge pull request #160 from docker/remove-buildx-dep
Remove buildx dep
This commit is contained in:
Коммит
42e4a43405
3
go.mod
3
go.mod
|
@ -9,7 +9,6 @@ require (
|
|||
github.com/cli/cli v1.1.0
|
||||
github.com/cloudflare/cfssl v1.4.1 // indirect
|
||||
github.com/containerd/containerd v1.4.3
|
||||
github.com/docker/buildx v0.5.1
|
||||
github.com/docker/cli v20.10.1+incompatible
|
||||
github.com/docker/compose-cli v1.0.5-0.20201215113846-10a19b115968
|
||||
github.com/docker/distribution v2.7.1+incompatible
|
||||
|
@ -34,5 +33,3 @@ require (
|
|||
gopkg.in/square/go-jose.v2 v2.5.1
|
||||
gotest.tools/v3 v3.0.3
|
||||
)
|
||||
|
||||
replace github.com/docker/distribution => github.com/docker/distribution v0.0.0-20201114020330-551158e6008e
|
||||
|
|
24
go.sum
24
go.sum
|
@ -172,6 +172,7 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hC
|
|||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
|
||||
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
|
||||
github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0=
|
||||
github.com/aws/aws-sdk-go v1.15.27/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0=
|
||||
github.com/aws/aws-sdk-go v1.15.90/go.mod h1:es1KtYUFs7le0xQ3rOihkuoVD90z7D0fR2Qm4S00/gU=
|
||||
github.com/aws/aws-sdk-go v1.16.26/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||
|
@ -181,10 +182,10 @@ github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN
|
|||
github.com/aws/aws-sdk-go v1.25.11/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||
github.com/aws/aws-sdk-go v1.27.1/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
|
||||
github.com/aws/aws-sdk-go v1.31.6/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
|
||||
github.com/aws/aws-sdk-go v1.34.9/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
|
||||
github.com/aws/aws-sdk-go v1.35.33/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
|
||||
github.com/awslabs/goformation/v4 v4.15.6/go.mod h1:wB5lKZf1J0MYH1Lt4B9w3opqz0uIjP7MMCAcib3QkwA=
|
||||
github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I=
|
||||
github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||
|
@ -322,8 +323,6 @@ github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQ
|
|||
github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
|
||||
github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
|
||||
github.com/docker/buildx v0.5.0-rc1/go.mod h1:YlxswdEKSMrxCCSYWU2p/Ii1oOOwu8lT3tJzJDpP7J4=
|
||||
github.com/docker/buildx v0.5.1 h1:lkMHQPKHyUUDbO2QO2JE9LLi8mlOULpzSoV7B/2XKso=
|
||||
github.com/docker/buildx v0.5.1/go.mod h1:YlxswdEKSMrxCCSYWU2p/Ii1oOOwu8lT3tJzJDpP7J4=
|
||||
github.com/docker/cli v0.0.0-20190925022749-754388324470/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||
github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||
github.com/docker/cli v20.10.0-beta1.0.20201029214301-1d20b15adc38+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
||||
|
@ -333,8 +332,10 @@ github.com/docker/cli v20.10.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHv
|
|||
github.com/docker/compose-cli v1.0.5-0.20201215113846-10a19b115968 h1:2zDqY5lLTXjnxdRrWhOlwr1ANs/axwNszt1JFEmYeTk=
|
||||
github.com/docker/compose-cli v1.0.5-0.20201215113846-10a19b115968/go.mod h1:yjDYInOItSSD8jRHBHlhnNcavAJKFz6pPXuZoyJNFaw=
|
||||
github.com/docker/compose-on-kubernetes v0.4.19-0.20190128150448-356b2919c496/go.mod h1:iT2pYfi580XlpaV4KmK0T6+4/9+XoKmk/fhoDod1emE=
|
||||
github.com/docker/distribution v0.0.0-20201114020330-551158e6008e h1:c/rY4Z7qtkKZNivBE9tMf+ODKRj1tSpbOgx4pBpBZcE=
|
||||
github.com/docker/distribution v0.0.0-20201114020330-551158e6008e/go.mod h1:3MZHl2twGO5AALVRzN5pgJNCNS5WFMIfVXYT4qL7RtM=
|
||||
github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY=
|
||||
github.com/docker/distribution v2.6.0-rc.1.0.20180327202408-83389a148052+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||
github.com/docker/distribution v2.7.1+incompatible h1:a5mlkVzth6W5A4fOsS3D2EO5BUmsJpcB+cRlLU7cSug=
|
||||
github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
|
||||
github.com/docker/docker v0.0.0-20200511152416-a93e9eb0e95c/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||
github.com/docker/docker v0.7.3-0.20190327010347-be7ac8be2ae0/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||
github.com/docker/docker v1.4.2-0.20180531152204-71cd53e4a197/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
||||
|
@ -351,6 +352,7 @@ github.com/docker/go v1.5.1-1.0.20160303222718-d30aec9fd63c/go.mod h1:CADgU4DSXK
|
|||
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
|
||||
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
|
||||
github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA=
|
||||
github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI=
|
||||
github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQV8=
|
||||
github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw=
|
||||
github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
||||
|
@ -397,6 +399,7 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4
|
|||
github.com/fvbommel/sortorder v1.0.1/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
|
||||
github.com/fvbommel/sortorder v1.0.2 h1:mV4o8B2hKboCdkJm+a7uX/SIpZob4JzUpc5GGnM45eo=
|
||||
github.com/fvbommel/sortorder v1.0.2/go.mod h1:uk88iVf1ovNn1iLfgUVU2F9o5eO30ui720w+kxuqRs0=
|
||||
github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY=
|
||||
github.com/getsentry/raven-go v0.0.0-20180121060056-563b81fc02b7/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
|
||||
github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
|
||||
|
@ -521,7 +524,6 @@ github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bz
|
|||
github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4=
|
||||
github.com/golangci/revgrep v0.0.0-20180812185044-276a5c0a1039/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4=
|
||||
github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ=
|
||||
github.com/gomodule/redigo v1.8.2/go.mod h1:P9dn9mFrCBvWhGE1wpxx6fgq7BAeLBk+UUUzlpkBYO0=
|
||||
github.com/google/btree v0.0.0-20180124185431-e89373fe6b4a/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||
|
@ -588,6 +590,7 @@ github.com/goreleaser/nfpm v1.3.0/go.mod h1:w0p7Kc9TAUgWMyrub63ex3M2Mgw88M4GZXoT
|
|||
github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg=
|
||||
github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ=
|
||||
github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
|
||||
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
|
||||
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
|
||||
|
@ -675,6 +678,7 @@ github.com/jinzhu/now v1.0.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/
|
|||
github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0=
|
||||
github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0=
|
||||
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||
github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||
github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik=
|
||||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
|
||||
|
@ -865,10 +869,12 @@ github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoT
|
|||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||
github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc=
|
||||
github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk=
|
||||
github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||
github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||
github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
|
||||
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
||||
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
|
||||
github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
|
||||
github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI=
|
||||
github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
|
||||
github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U=
|
||||
|
@ -905,6 +911,7 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
|
|||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
||||
github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA=
|
||||
github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||
github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
|
||||
|
@ -913,12 +920,14 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn
|
|||
github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g=
|
||||
github.com/prometheus/client_golang v1.7.1 h1:NTGy1Ja9pByO+xAeH/qiWnLrKtr3hJPNjaVUwnjpdpA=
|
||||
github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
|
||||
github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
|
||||
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/client_model v0.2.0 h1:uq5h0d+GuxiXLJLNABMgp2qUWDPiLvgCzz2dUR+/W/M=
|
||||
github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
|
||||
github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||
github.com/prometheus/common v0.0.0-20180801064454-c7de2306084e/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||
github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
|
||||
github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
|
||||
|
@ -989,6 +998,7 @@ github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1
|
|||
github.com/smartystreets/assertions v1.0.0 h1:UVQPSSmc3qtTi+zPPkCXvZX9VvW/xT/NsRvKfwY81a8=
|
||||
github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
|
||||
github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
|
||||
github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||
github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
|
||||
github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
|
||||
github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs=
|
||||
|
@ -1152,7 +1162,6 @@ golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8U
|
|||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20191205180655-e7c4368fe9dd/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200220183623-bac4c82f6975/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
|
@ -1289,6 +1298,7 @@ golang.org/x/sys v0.0.0-20190502175342-a43fa875dd82/go.mod h1:h1NjWce9XRLGQEsW7w
|
|||
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190530182044-ad28b68e88f1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
|
|
|
@ -17,21 +17,23 @@
|
|||
package tag
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
"sort"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/containerd/containerd/images"
|
||||
"github.com/docker/buildx/util/imagetools"
|
||||
"github.com/containerd/containerd/platforms"
|
||||
"github.com/containerd/containerd/remotes"
|
||||
"github.com/containerd/containerd/remotes/docker"
|
||||
"github.com/docker/cli/cli"
|
||||
"github.com/docker/cli/cli/command"
|
||||
clitypes "github.com/docker/cli/cli/config/types"
|
||||
"github.com/docker/distribution/reference"
|
||||
"github.com/docker/docker/api/types"
|
||||
"github.com/docker/go-units"
|
||||
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
"github.com/spf13/cobra"
|
||||
|
@ -46,7 +48,8 @@ const (
|
|||
)
|
||||
|
||||
type inspectOptions struct {
|
||||
format string
|
||||
format string
|
||||
platform string
|
||||
}
|
||||
|
||||
//Image is the combination of a manifest and its config object
|
||||
|
@ -57,6 +60,13 @@ type Image struct {
|
|||
Descriptor ocispec.Descriptor
|
||||
}
|
||||
|
||||
//Index is the combination of an OCI index and its descriptor
|
||||
type Index struct {
|
||||
Name string
|
||||
Index ocispec.Index
|
||||
Descriptor ocispec.Descriptor
|
||||
}
|
||||
|
||||
func newInspectCmd(streams command.Streams, hubClient *hub.Client, parent string) *cobra.Command {
|
||||
var opts inspectOptions
|
||||
cmd := &cobra.Command{
|
||||
|
@ -72,55 +82,122 @@ func newInspectCmd(streams command.Streams, hubClient *hub.Client, parent string
|
|||
},
|
||||
}
|
||||
cmd.Flags().StringVar(&opts.format, "format", "", `Print original manifest ("json|raw")`)
|
||||
cmd.Flags().StringVar(&opts.platform, "platform", "", `Select a platform if the tag is a multi-architecture image`)
|
||||
return cmd
|
||||
}
|
||||
|
||||
func runInspect(streams command.Streams, hubClient *hub.Client, opts inspectOptions, imageRef string) error {
|
||||
resolver := imagetools.New(imagetools.Opt{
|
||||
Auth: &authResolver{
|
||||
authConfig: convert(hubClient.AuthConfig),
|
||||
},
|
||||
var (
|
||||
platform *ocispec.Platform
|
||||
)
|
||||
if opts.platform != "" {
|
||||
p, err := platforms.Parse(opts.platform)
|
||||
if err != nil {
|
||||
return fmt.Errorf("invalid platform %q: %s", opts.platform, err)
|
||||
}
|
||||
platform = &p
|
||||
}
|
||||
authorizer := docker.NewDockerAuthorizer(docker.WithAuthCreds(func(string) (string, string, error) {
|
||||
return hubClient.AuthConfig.Username, hubClient.AuthConfig.Password, nil
|
||||
}))
|
||||
registryHosts := docker.ConfigureDefaultRegistries(docker.WithClient(http.DefaultClient), docker.WithAuthorizer(authorizer))
|
||||
|
||||
resolver := docker.NewResolver(docker.ResolverOptions{
|
||||
Hosts: registryHosts,
|
||||
})
|
||||
|
||||
raw, descriptor, err := resolver.Get(hubClient.Ctx, imageRef)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Parse image reference
|
||||
ref, err := reference.ParseNormalizedNamed(imageRef)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
ref = reference.TagNameOnly(ref)
|
||||
|
||||
// Read descriptor
|
||||
fullName, descriptor, err := resolver.Resolve(hubClient.Ctx, ref.String())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
raw, err := getBlob(hubClient.Ctx, resolver, fullName, descriptor)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
switch descriptor.MediaType {
|
||||
// case images.MediaTypeDockerSchema2Manifest, specs.MediaTypeImageManifest:
|
||||
// TODO: handle distribution manifest and schema1
|
||||
case images.MediaTypeDockerSchema2ManifestList, ocispec.MediaTypeImageIndex:
|
||||
return formatManifestlist(streams, opts.format, raw, descriptor, imageRef)
|
||||
return formatManifestlist(hubClient.Ctx, streams, resolver, opts.format, raw, descriptor, ref.Name(), platform)
|
||||
case images.MediaTypeDockerSchema2Manifest, ocispec.MediaTypeImageManifest:
|
||||
return formatManifest(hubClient.Ctx, streams, resolver, opts.format, raw, descriptor, ref.Name())
|
||||
default:
|
||||
fmt.Println("Other mediatype")
|
||||
fmt.Printf("%s\n", raw)
|
||||
fmt.Fprintln(streams.Out(), ansi.Title("Unsupported mediatype"))
|
||||
fmt.Fprintln(streams.Out(), raw)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func formatManifestlist(streams command.Streams, format string, raw []byte, descriptor ocispec.Descriptor, imageRef string) error {
|
||||
func getBlob(ctx context.Context, resolver remotes.Resolver, fullName string, descriptor ocispec.Descriptor) ([]byte, error) {
|
||||
// Fetch the blob
|
||||
fetcher, err := resolver.Fetcher(ctx, fullName)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
rc, err := fetcher.Fetch(ctx, descriptor)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer func() {
|
||||
_ = rc.Close()
|
||||
}()
|
||||
|
||||
// Read the blob
|
||||
buf := bytes.NewBuffer(nil)
|
||||
if _, err = io.Copy(buf, rc); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return buf.Bytes(), nil
|
||||
}
|
||||
|
||||
func formatManifestlist(ctx context.Context, streams command.Streams, resolver remotes.Resolver,
|
||||
format string, raw []byte, descriptor ocispec.Descriptor, name string, platform *ocispec.Platform) error {
|
||||
var index ocispec.Index
|
||||
if err := json.Unmarshal(raw, &index); err != nil {
|
||||
return err
|
||||
}
|
||||
if platform != nil {
|
||||
return formatSelectManifest(ctx, streams, resolver, format, name, *platform, index)
|
||||
}
|
||||
|
||||
image := Index{
|
||||
Name: name,
|
||||
Index: index,
|
||||
Descriptor: descriptor,
|
||||
}
|
||||
switch format {
|
||||
case "json", "raw":
|
||||
case "raw":
|
||||
_, err := fmt.Printf("%s", raw) // avoid newline to keep digest
|
||||
return err
|
||||
case "json":
|
||||
buf, err := json.MarshalIndent(index, "", " ")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = fmt.Fprint(streams.Out(), string(buf))
|
||||
return err
|
||||
case "":
|
||||
return imagetools.PrintManifestList(raw, descriptor, imageRef, streams.Out())
|
||||
return printManifestList(streams.Out(), image)
|
||||
default:
|
||||
return fmt.Errorf("unsupported format type: %q", format)
|
||||
}
|
||||
}
|
||||
|
||||
func formatManifest(ctx context.Context, streams command.Streams, resolver *imagetools.Resolver, format string, raw []byte, descriptor ocispec.Descriptor, name string) error {
|
||||
func formatManifest(ctx context.Context, streams command.Streams, resolver remotes.Resolver,
|
||||
format string, raw []byte, descriptor ocispec.Descriptor, name string) error {
|
||||
image, err := readImage(ctx, resolver, raw, descriptor, name)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -143,14 +220,35 @@ func formatManifest(ctx context.Context, streams command.Streams, resolver *imag
|
|||
}
|
||||
}
|
||||
|
||||
func readImage(ctx context.Context, resolver *imagetools.Resolver, rawManifest []byte, descriptor ocispec.Descriptor, name string) (*Image, error) {
|
||||
func formatSelectManifest(ctx context.Context, streams command.Streams, resolver remotes.Resolver,
|
||||
format string, name string, platform ocispec.Platform, index ocispec.Index) error {
|
||||
matcher := platforms.NewMatcher(platform)
|
||||
var selectedDescriptor *ocispec.Descriptor
|
||||
for _, descriptor := range index.Manifests {
|
||||
if descriptor.Platform != nil && matcher.Match(*descriptor.Platform) {
|
||||
selectedDescriptor = &descriptor
|
||||
break
|
||||
}
|
||||
}
|
||||
if selectedDescriptor == nil {
|
||||
return fmt.Errorf("platform %q does not match any available platform for the tag %q", platforms.Format(platform), name)
|
||||
}
|
||||
raw, err := getBlob(ctx, resolver, name, *selectedDescriptor)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return formatManifest(ctx, streams, resolver, format, raw, *selectedDescriptor, name)
|
||||
}
|
||||
|
||||
func readImage(ctx context.Context, resolver remotes.Resolver, rawManifest []byte, descriptor ocispec.Descriptor, name string) (*Image, error) {
|
||||
var manifest ocispec.Manifest
|
||||
if err := json.Unmarshal(rawManifest, &manifest); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
configRef := fmt.Sprintf("%s@%s", name, manifest.Config.Digest)
|
||||
configRaw, err := resolver.GetDescriptor(ctx, configRef, manifest.Config)
|
||||
|
||||
configRaw, err := getBlob(ctx, resolver, configRef, manifest.Config)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
@ -172,13 +270,39 @@ func printImage(out io.Writer, image *Image) error {
|
|||
return printLayers(out, image)
|
||||
}
|
||||
|
||||
func printManifestList(out io.Writer, image Index) error {
|
||||
fmt.Fprintf(out, ansi.Title("Manifest List:")+"\n")
|
||||
fmt.Fprintf(out, ansi.Key("Name:")+"\t\t%s\n", image.Name)
|
||||
fmt.Fprintf(out, ansi.Key("MediaType:")+"\t%s\n", image.Descriptor.MediaType)
|
||||
fmt.Fprintf(out, ansi.Key("Digest:")+"\t\t%s\n", image.Descriptor.Digest)
|
||||
if len(image.Index.Annotations) > 0 {
|
||||
printAnnotations(out, image.Index.Annotations)
|
||||
} else if len(image.Descriptor.Annotations) > 0 {
|
||||
printAnnotations(out, image.Descriptor.Annotations)
|
||||
}
|
||||
|
||||
fmt.Fprintf(out, "\n")
|
||||
|
||||
fmt.Fprintf(out, ansi.Title("Manifests:")+"\n")
|
||||
for i, m := range image.Index.Manifests {
|
||||
if i != 0 {
|
||||
fmt.Fprintln(out)
|
||||
}
|
||||
fmt.Fprintf(out, ansi.Key("Name:")+"\t\t%s\n", fmt.Sprintf("%s@%s", image.Name, m.Digest))
|
||||
fmt.Fprintf(out, ansi.Key("Mediatype:")+"\t%s\n", m.MediaType)
|
||||
fmt.Fprintf(out, ansi.Key("Platform:")+"\t%s\n", formatPlatform(m.Platform))
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func printManifest(out io.Writer, image *Image) error {
|
||||
fmt.Fprintf(out, ansi.Title("Manifest:")+"\n")
|
||||
fmt.Fprintf(out, ansi.Key("Name:")+"\t\t%s\n", image.Name)
|
||||
fmt.Fprintf(out, ansi.Key("MediaType:")+"\t%s\n", image.Descriptor.MediaType)
|
||||
fmt.Fprintf(out, ansi.Key("Digest:")+"\t\t%s\n", image.Descriptor.Digest)
|
||||
if image.Descriptor.Platform != nil {
|
||||
fmt.Fprintf(out, ansi.Key("Platform:")+"\t%s\n", getPlatform(image.Descriptor.Platform))
|
||||
fmt.Fprintf(out, ansi.Key("Platform:")+"\t%s\n", formatPlatform(image.Descriptor.Platform))
|
||||
}
|
||||
if len(image.Manifest.Annotations) > 0 {
|
||||
printAnnotations(out, image.Manifest.Annotations)
|
||||
|
@ -267,18 +391,11 @@ func printLayers(out io.Writer, image *Image) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
func getPlatform(platform *ocispec.Platform) string {
|
||||
result := fmt.Sprintf("%s/%s", platform.OS, platform.Architecture)
|
||||
if platform.Variant != "" {
|
||||
result += "/" + platform.Variant
|
||||
func formatPlatform(platform *ocispec.Platform) string {
|
||||
if platform == nil {
|
||||
return ""
|
||||
}
|
||||
if platform.OSVersion != "" {
|
||||
result += "/" + platform.OSVersion
|
||||
}
|
||||
if len(platform.OSFeatures) > 0 {
|
||||
result += "/" + strings.Join(platform.OSFeatures, "/")
|
||||
}
|
||||
return result
|
||||
return platforms.Format(*platform)
|
||||
}
|
||||
|
||||
func cleanCreatedBy(history string) string {
|
||||
|
@ -313,26 +430,6 @@ func printAnnotations(out io.Writer, annotations map[string]string) {
|
|||
}
|
||||
}
|
||||
|
||||
type authResolver struct {
|
||||
authConfig clitypes.AuthConfig
|
||||
}
|
||||
|
||||
func (a *authResolver) GetAuthConfig(registryHostname string) (clitypes.AuthConfig, error) {
|
||||
return a.authConfig, nil
|
||||
}
|
||||
|
||||
func convert(config types.AuthConfig) clitypes.AuthConfig {
|
||||
return clitypes.AuthConfig{
|
||||
Username: config.Username,
|
||||
Password: config.Password,
|
||||
Auth: config.Auth,
|
||||
Email: config.Email,
|
||||
ServerAddress: config.ServerAddress,
|
||||
IdentityToken: config.IdentityToken,
|
||||
RegistryToken: config.RegistryToken,
|
||||
}
|
||||
}
|
||||
|
||||
func sortMapKeys(m map[string]string) []string {
|
||||
keys := make([]string, 0, len(m))
|
||||
for k := range m {
|
||||
|
|
|
@ -21,7 +21,6 @@ import (
|
|||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/docker/distribution/reference"
|
||||
"github.com/opencontainers/image-spec/specs-go"
|
||||
ocispec "github.com/opencontainers/image-spec/specs-go/v1"
|
||||
"gotest.tools/v3/assert"
|
||||
|
@ -90,17 +89,55 @@ func TestPrintImage(t *testing.T) {
|
|||
Platform: &ocispec.Platform{
|
||||
Architecture: "arch",
|
||||
OS: "os",
|
||||
OSVersion: "osversion",
|
||||
OSFeatures: []string{"feature1", "feature2"},
|
||||
Variant: "variant",
|
||||
},
|
||||
}
|
||||
ref, err := reference.ParseDockerRef("image:latest")
|
||||
assert.NilError(t, err)
|
||||
image := Image{ref.Name(), manifest, config, manifestDescriptor}
|
||||
image := Image{"image:latest", manifest, config, manifestDescriptor}
|
||||
|
||||
out := bytes.NewBuffer(nil)
|
||||
err = printImage(out, &image)
|
||||
err := printImage(out, &image)
|
||||
assert.NilError(t, err)
|
||||
golden.Assert(t, out.String(), "printimage.golden")
|
||||
golden.Assert(t, out.String(), "inspect-manifest.golden")
|
||||
}
|
||||
|
||||
func TestPrintIndex(t *testing.T) {
|
||||
index := ocispec.Index{
|
||||
Versioned: specs.Versioned{},
|
||||
Manifests: []ocispec.Descriptor{
|
||||
{
|
||||
MediaType: "mediatype/manifest",
|
||||
Digest: "sha256:abcdef",
|
||||
Annotations: nil,
|
||||
Platform: &ocispec.Platform{
|
||||
Architecture: "arch",
|
||||
OS: "os",
|
||||
Variant: "variant",
|
||||
},
|
||||
},
|
||||
{
|
||||
MediaType: "mediatype/manifest",
|
||||
Digest: "sha256:beef",
|
||||
Annotations: nil,
|
||||
Platform: &ocispec.Platform{
|
||||
Architecture: "arch2",
|
||||
OS: "os2",
|
||||
},
|
||||
},
|
||||
},
|
||||
Annotations: map[string]string{
|
||||
"annotation1": "value1",
|
||||
"annotation2": "value2",
|
||||
},
|
||||
}
|
||||
indexDescriptor := ocispec.Descriptor{
|
||||
MediaType: "mediatype/ociindex",
|
||||
Digest: "sha256:abcdef",
|
||||
Size: 789,
|
||||
}
|
||||
image := Index{"image:latest", index, indexDescriptor}
|
||||
|
||||
out := bytes.NewBuffer(nil)
|
||||
err := printManifestList(out, image)
|
||||
assert.NilError(t, err)
|
||||
golden.Assert(t, out.String(), "inspect-manifest-list.golden")
|
||||
}
|
||||
|
|
|
@ -0,0 +1,16 @@
|
|||
Manifest List:
|
||||
Name: image:latest
|
||||
MediaType: mediatype/ociindex
|
||||
Digest: sha256:abcdef
|
||||
Annotations:
|
||||
annotation1: value1
|
||||
annotation2: value2
|
||||
|
||||
Manifests:
|
||||
Name: image:latest@sha256:abcdef
|
||||
Mediatype: mediatype/manifest
|
||||
Platform: os/arch/variant
|
||||
|
||||
Name: image:latest@sha256:beef
|
||||
Mediatype: mediatype/manifest
|
||||
Platform: os2/arch2
|
|
@ -1,8 +1,8 @@
|
|||
Manifest:
|
||||
Name: docker.io/library/image
|
||||
Name: image:latest
|
||||
MediaType: mediatype/manifest
|
||||
Digest: sha256:abcdef
|
||||
Platform: os/arch/variant/osversion/feature1/feature2
|
||||
Platform: os/arch/variant
|
||||
Annotations:
|
||||
annotation1: value1
|
||||
annotation2: value2
|
Загрузка…
Ссылка в новой задаче