0%

Build a docker image: bettercap

Make directory for bettercap and build docker image under this diretory, not recommend under root.
Clone the dockerfile from github,
Note: git clone the whole git repo, otherwise build process will failed because of lacking some files such as makefile.

1
git clone https://github.com/bettercap/bettercap.git

build the docker image

Note: it needs at least 4G memory. I used the Pi 3B+, which only has 1G memory, it failed. then I changed to Pi4.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
root@vmnet8cloud:~/bettercap/bettercap# docker build .
Sending build context to Docker daemon 19.83MB
Step 1/17 : FROM golang:alpine AS build-env
---> 6a83a6459979
Step 2/17 : ENV SRC_DIR $GOPATH/src/github.com/bettercap/bettercap
---> Running in f7be9c390ea2
Removing intermediate container f7be9c390ea2
---> 574512a28fc9
Step 3/17 : RUN apk add --update ca-certificates
---> Running in b93f2b7777b8
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/armv7/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/armv7/APKINDEX.tar.gz
OK: 4 MiB in 15 packages
Removing intermediate container b93f2b7777b8
---> 6a02504d09c8
Step 4/17 : RUN apk add --no-cache --update bash iptables wireless-tools build-base libpcap-dev libusb-dev linux-headers libnetfilter_queue-dev git
---> Running in 504d45657d66
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/armv7/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/armv7/APKINDEX.tar.gz
(1/42) Installing ncurses-terminfo-base (6.1_p20190518-r0)
(2/42) Installing ncurses-terminfo (6.1_p20190518-r0)
(3/42) Installing ncurses-libs (6.1_p20190518-r0)
(4/42) Installing readline (8.0.0-r0)
(5/42) Installing bash (5.0.0-r0)
Executing bash-5.0.0-r0.post-install
(6/42) Installing binutils (2.32-r0)
(7/42) Installing libmagic (5.37-r1)
(8/42) Installing file (5.37-r1)
(9/42) Installing gmp (6.1.2-r1)
(10/42) Installing isl (0.18-r0)
(11/42) Installing libgomp (8.3.0-r0)
(12/42) Installing libatomic (8.3.0-r0)
(13/42) Installing libgcc (8.3.0-r0)
(14/42) Installing mpfr3 (3.1.5-r1)
(15/42) Installing mpc1 (1.1.0-r0)
(16/42) Installing libstdc++ (8.3.0-r0)
(17/42) Installing gcc (8.3.0-r0)
(18/42) Installing musl-dev (1.1.22-r3)
(19/42) Installing libc-dev (0.7.1-r0)
(20/42) Installing g++ (8.3.0-r0)
(21/42) Installing make (4.2.1-r2)
(22/42) Installing fortify-headers (1.1-r0)
(23/42) Installing build-base (0.5-r1)
(24/42) Installing nghttp2-libs (1.39.2-r0)
(25/42) Installing libcurl (7.66.0-r0)
(26/42) Installing expat (2.2.8-r0)
(27/42) Installing pcre2 (10.33-r0)
(28/42) Installing git (2.22.0-r0)
(29/42) Installing libmnl (1.0.4-r0)
(30/42) Installing libnftnl-libs (1.1.3-r0)
(31/42) Installing iptables (1.8.3-r0)
(32/42) Installing libnfnetlink (1.0.1-r1)
(33/42) Installing libnetfilter_queue (1.0.3-r0)
(34/42) Installing pkgconf (1.6.1-r1)
(35/42) Installing libnfnetlink-dev (1.0.1-r1)
(36/42) Installing libnetfilter_queue-dev (1.0.3-r0)
(37/42) Installing libpcap (1.9.1-r0)
(38/42) Installing libpcap-dev (1.9.1-r0)
(39/42) Installing libusb (1.0.22-r0)
(40/42) Installing libusb-dev (1.0.22-r0)
(41/42) Installing linux-headers (4.19.36-r0)
(42/42) Installing wireless-tools (30_pre9-r1)
Executing busybox-1.30.1-r2.trigger
OK: 144 MiB in 57 packages
Removing intermediate container 504d45657d66
---> f648d787ff0e
Step 5/17 : WORKDIR $SRC_DIR
---> Running in e14fcfed0d87
Removing intermediate container e14fcfed0d87
---> 181d2b3b343f
Step 6/17 : ADD . $SRC_DIR
---> 4461303d94d7
Step 7/17 : RUN make
---> Running in 1faa1d85eb96
go build -o bettercap .
go: downloading github.com/evilsocket/islazy v1.10.4
go: downloading github.com/dustin/go-humanize v1.0.0
go: downloading github.com/bettercap/readline v0.0.0-20180208083827-9cec905dd291
go: downloading github.com/google/gopacket v1.1.17
go: downloading github.com/jpillora/go-tld v0.0.0-20190202073305-f16ca3b7b383
go: extracting github.com/dustin/go-humanize v1.0.0
go: downloading github.com/gobwas/glob v0.0.0-20181002190808-e7a84e9525fe
go: extracting github.com/evilsocket/islazy v1.10.4
go: extracting github.com/bettercap/readline v0.0.0-20180208083827-9cec905dd291
go: downloading github.com/malfunkt/iprange v0.9.0
go: downloading github.com/antchfx/jsonquery v1.0.0
go: downloading github.com/miekg/dns v1.1.22
go: downloading github.com/bettercap/nrf24 v0.0.0-20190219153547-aa37e6d0e0eb
go: downloading github.com/google/gousb v0.0.0-20190812193832-18f4c1d8a750
go: extracting github.com/antchfx/jsonquery v1.0.0
go: extracting github.com/malfunkt/iprange v0.9.0
go: extracting github.com/jpillora/go-tld v0.0.0-20190202073305-f16ca3b7b383
go: extracting github.com/bettercap/nrf24 v0.0.0-20190219153547-aa37e6d0e0eb
go: extracting github.com/gobwas/glob v0.0.0-20181002190808-e7a84e9525fe
go: downloading github.com/pkg/errors v0.8.1
go: downloading github.com/inconshreveable/go-vhost v0.0.0-20160627193104-06d84117953b
go: downloading github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d
go: downloading github.com/antchfx/xpath v1.1.0
go: downloading github.com/bettercap/recording v0.0.0-20190408083647-3ce1dcf032e3
go: extracting github.com/miekg/dns v1.1.22
go: extracting github.com/google/gousb v0.0.0-20190812193832-18f4c1d8a750
go: extracting github.com/pkg/errors v0.8.1
go: extracting github.com/inconshreveable/go-vhost v0.0.0-20160627193104-06d84117953b
go: downloading github.com/google/go-github v17.0.0+incompatible
go: downloading github.com/gorilla/websocket v1.4.1
go: extracting github.com/antchfx/xpath v1.1.0
go: extracting github.com/bettercap/recording v0.0.0-20190408083647-3ce1dcf032e3
go: downloading github.com/gorilla/mux v1.7.3
go: extracting github.com/gorilla/websocket v1.4.1
go: downloading github.com/bettercap/gatt v0.0.0-20191018133023-569d3d9372bb
go: extracting github.com/google/gopacket v1.1.17
go: downloading golang.org/x/net v0.0.0-20191014212845-da9a3fd4c582
go: extracting github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d
go: extracting github.com/gorilla/mux v1.7.3
go: downloading github.com/adrianmo/go-nmea v1.1.0
go: downloading github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07
go: extracting github.com/google/go-github v17.0.0+incompatible
go: extracting github.com/bettercap/gatt v0.0.0-20191018133023-569d3d9372bb
go: downloading golang.org/x/sys v0.0.0-20191018095205-727590c5006e
go: downloading github.com/kr/binarydist v0.1.0
go: downloading github.com/mdlayher/dhcp6 v0.0.0-20190311162359-2a67805d7d0b
go: extracting github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07
go: extracting github.com/adrianmo/go-nmea v1.1.0
go: extracting github.com/kr/binarydist v0.1.0
go: downloading github.com/hashicorp/mdns v1.0.1
go: downloading github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484
go: downloading golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550
go: downloading gopkg.in/sourcemap.v1 v1.0.5
go: extracting github.com/mdlayher/dhcp6 v0.0.0-20190311162359-2a67805d7d0b
go: downloading github.com/google/go-querystring v1.0.0
go: downloading github.com/mgutz/logxi v0.0.0-20161027140823-aebf8a7d67ab
go: extracting github.com/hashicorp/mdns v1.0.1
go: extracting gopkg.in/sourcemap.v1 v1.0.5
go: extracting github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484
go: downloading github.com/mitchellh/go-homedir v1.1.0
go: extracting github.com/google/go-querystring v1.0.0
go: extracting golang.org/x/net v0.0.0-20191014212845-da9a3fd4c582
go: extracting github.com/mitchellh/go-homedir v1.1.0
go: extracting github.com/mgutz/logxi v0.0.0-20161027140823-aebf8a7d67ab
go: downloading github.com/mattn/go-isatty v0.0.10
go: downloading github.com/mattn/go-colorable v0.1.4
go: downloading github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b
go: extracting github.com/mattn/go-isatty v0.0.10
go: extracting github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b
go: extracting github.com/mattn/go-colorable v0.1.4
go: extracting golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550
go: extracting golang.org/x/sys v0.0.0-20191018095205-727590c5006e
go: finding github.com/evilsocket/islazy v1.10.4
go: finding github.com/malfunkt/iprange v0.9.0
go: finding github.com/dustin/go-humanize v1.0.0
go: finding github.com/mitchellh/go-homedir v1.1.0
go: finding github.com/adrianmo/go-nmea v1.1.0
go: finding github.com/bettercap/readline v0.0.0-20180208083827-9cec905dd291
go: finding github.com/bettercap/gatt v0.0.0-20191018133023-569d3d9372bb
go: finding github.com/bettercap/recording v0.0.0-20190408083647-3ce1dcf032e3
go: finding github.com/gorilla/mux v1.7.3
go: finding github.com/mgutz/logxi v0.0.0-20161027140823-aebf8a7d67ab
go: finding github.com/google/gopacket v1.1.17
go: finding github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07
go: finding github.com/gorilla/websocket v1.4.1
go: finding github.com/antchfx/jsonquery v1.0.0
go: finding github.com/mattn/go-colorable v0.1.4
go: finding github.com/gobwas/glob v0.0.0-20181002190808-e7a84e9525fe
go: finding github.com/bettercap/nrf24 v0.0.0-20190219153547-aa37e6d0e0eb
go: finding github.com/mdlayher/dhcp6 v0.0.0-20190311162359-2a67805d7d0b
go: finding github.com/pkg/errors v0.8.1
go: finding github.com/mattn/go-isatty v0.0.10
go: finding github.com/robertkrimen/otto v0.0.0-20180617131154-15f95af6e78d
go: finding golang.org/x/sys v0.0.0-20191018095205-727590c5006e
go: finding github.com/google/gousb v0.0.0-20190812193832-18f4c1d8a750
go: finding github.com/kr/binarydist v0.1.0
go: finding github.com/antchfx/xpath v1.1.0
go: finding github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b
go: finding github.com/hashicorp/mdns v1.0.1
go: finding github.com/elazarl/goproxy v0.0.0-20191011121108-aa519ddbe484
go: finding github.com/miekg/dns v1.1.22
go: finding github.com/google/go-github v17.0.0+incompatible
go: finding golang.org/x/net v0.0.0-20191014212845-da9a3fd4c582
go: finding gopkg.in/sourcemap.v1 v1.0.5
go: finding github.com/inconshreveable/go-vhost v0.0.0-20160627193104-06d84117953b
go: finding github.com/jpillora/go-tld v0.0.0-20190202073305-f16ca3b7b383
go: finding github.com/google/go-querystring v1.0.0
go: finding golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550
Removing intermediate container 1faa1d85eb96
---> b3d614b2ec69
Step 8/17 : RUN mkdir -p /usr/local/share/bettercap
---> Running in 14eb7daf4ff8
Removing intermediate container 14eb7daf4ff8
---> 68727ce1be68
Step 9/17 : RUN git clone https://github.com/bettercap/caplets /usr/local/share/bettercap/caplets
---> Running in be1c4c4a54cc
Cloning into '/usr/local/share/bettercap/caplets'...
Removing intermediate container be1c4c4a54cc
---> 2c4f0fa1e524
Step 10/17 : FROM alpine
latest: Pulling from library/alpine
99fc70ac0b64: Already exists
Digest: sha256:c19173c5ada610a5989151111163d28a67368362762534d8a8121ce95cf2bd5a
Status: Downloaded newer image for alpine:latest
---> 27560c0c9c97
Step 11/17 : RUN apk add --update ca-certificates
---> Running in 509fe0867c6d
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/armv7/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/armv7/APKINDEX.tar.gz
(1/1) Installing ca-certificates (20190108-r0)
Executing busybox-1.30.1-r2.trigger
Executing ca-certificates-20190108-r0.trigger
OK: 4 MiB in 15 packages
Removing intermediate container 509fe0867c6d
---> 9293f9271587
Step 12/17 : RUN apk add --no-cache --update bash iproute2 libpcap libusb-dev libnetfilter_queue wireless-tools
---> Running in 65daa4f9d22b
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/armv7/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/armv7/APKINDEX.tar.gz
(1/16) Installing ncurses-terminfo-base (6.1_p20190518-r0)
(2/16) Installing ncurses-terminfo (6.1_p20190518-r0)
(3/16) Installing ncurses-libs (6.1_p20190518-r0)
(4/16) Installing readline (8.0.0-r0)
(5/16) Installing bash (5.0.0-r0)
Executing bash-5.0.0-r0.post-install
(6/16) Installing libmnl (1.0.4-r0)
(7/16) Installing libnftnl-libs (1.1.3-r0)
(8/16) Installing iptables (1.8.3-r0)
(9/16) Installing iproute2 (4.20.0-r1)
Executing iproute2-4.20.0-r1.post-install
(10/16) Installing libnfnetlink (1.0.1-r1)
(11/16) Installing libnetfilter_queue (1.0.3-r0)
(12/16) Installing libpcap (1.9.1-r0)
(13/16) Installing libusb (1.0.22-r0)
(14/16) Installing pkgconf (1.6.1-r1)
(15/16) Installing libusb-dev (1.0.22-r0)
(16/16) Installing wireless-tools (30_pre9-r1)
Executing busybox-1.30.1-r2.trigger
OK: 16 MiB in 31 packages
Removing intermediate container 65daa4f9d22b
---> de5bed4329f4
Step 13/17 : COPY --from=build-env /go/src/github.com/bettercap/bettercap/bettercap /app/
---> 7509d206b9bb
Step 14/17 : COPY --from=build-env /usr/local/share/bettercap/caplets /app/
---> 867af90533b0
Step 15/17 : WORKDIR /app
---> Running in e6badf626501
Removing intermediate container e6badf626501
---> c8d068058c77
Step 16/17 : EXPOSE 80 443 53 5300 8080 8081 8082 8083 8000
---> Running in dee9fe5c9c12
Removing intermediate container dee9fe5c9c12
---> e09ab03d9632
Step 17/17 : ENTRYPOINT ["/app/bettercap"]
---> Running in 056b18a9cf33
Removing intermediate container 056b18a9cf33
---> fa1faf86b2e9
Successfully built fa1faf86b2e9

it shows I successfully build an image.

push the image to dockerhub repo

I need to create a dockerhub account first then log in.

1
2
3
4
5
6
7
8
9
root@vmnet8cloud:~/bettercap/bettercap# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: vmnet8
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

On dockhub.com, create new repo, and name the repo

create a tag for my image

1
root@vmnet8cloud:~/bettercap/bettercap# docker image tag fa1faf86b2e9 vmnet8/bettercap:first

check if it works

1
2
3
root@vmnet8cloud:~/bettercap/bettercap# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
vmnet8/bettercap first fa1faf86b2e9 45 hours ago 35.9MB

push this image to dockerhub

1
2
3
4
5
6
7
8
root@vmnet8cloud:~/bettercap/bettercap# docker push vmnet8/bettercap:first
The push refers to repository [docker.io/vmnet8/bettercap]
6932e1802232: Pushed
1c42bc244f9a: Pushed
316457fe74cb: Pushed
dbba7885a7cb: Pushed
30a0150d2171: Pushed
first: digest: sha256:42cb2a552f6b3f4b11f2d9514fd8d8e4288af7060bd148ec78fc4931551b89dc size: 1372

docker manifest

The docker manifest command gives users additional information such as the os and architecture an image was built for.
A manifest list is a list of image layers that is created by specifying one or more (ideally more than one) image names.
Ideally a manifest list is created from images that are identical in function for different os/arch combinations. For this reason, manifest lists are often referred to as “multi-arch images”. However, a user could create a manifest list that points to two images – one for windows on amd64, and one for darwin on amd64.

manifest inspect

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
root@vmnet8cloud:~/bettercap/bettercap# docker manifest inspect -v vmnet8/bettercap:first
{
"Ref": "docker.io/vmnet8/bettercap:first",
"Descriptor": {
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"digest": "sha256:42cb2a552f6b3f4b11f2d9514fd8d8e4288af7060bd148ec78fc4931551b89dc",
"size": 1372,
"platform": {
"architecture": "arm",
"os": "linux"
}
},
"SchemaV2Manifest": {
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 3064,
"digest": "sha256:fa1faf86b2e927540757fbf1da0cabc747ef90de3ba0ac79b92c3a2524aa30e0"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 2378437,
"digest": "sha256:99fc70ac0b64db67086f98ceb3942600816eed98046abd6be5ad66f4614a9ca2"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 1674759,
"digest": "sha256:9870f62c5af97178d2b7f26ef09285c407bb8f86e1be9bcf9d82aeb5a036b7f6"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 2445148,
"digest": "sha256:cbb20a312883952b6b42b5f71171308cc5e7a1183bad442878febba39a7ae4c1"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 11138965,
"digest": "sha256:b998c1e6578adab28ed6958da133eeff1b72412d0be30ca5b2dc7603eb906ddb"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 616532,
"digest": "sha256:17c2d33598da93c28bc860cff35445cb8335a12d0c2c102ec15bd2fccba5e24b"
}
]
}
}

create a manifest

1
2
root@vmnet8cloud:~/bettercap/bettercap# docker manifest create vmnet8/bettercap:latest vmnet8/bettercap:linux-arm
Created manifest list docker.io/vmnet8/bettercap:latest

manifest inspect

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
root@vmnet8cloud:~/bettercap/bettercap# docker manifest inspect -v vmnet8/bettercap:linux-arm
{
"Ref": "docker.io/vmnet8/bettercap:linux-arm",
"Descriptor": {
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"digest": "sha256:42cb2a552f6b3f4b11f2d9514fd8d8e4288af7060bd148ec78fc4931551b89dc",
"size": 1372,
"platform": {
"architecture": "arm",
"os": "linux"
}
},
"SchemaV2Manifest": {
"schemaVersion": 2,
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
"config": {
"mediaType": "application/vnd.docker.container.image.v1+json",
"size": 3064,
"digest": "sha256:fa1faf86b2e927540757fbf1da0cabc747ef90de3ba0ac79b92c3a2524aa30e0"
},
"layers": [
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 2378437,
"digest": "sha256:99fc70ac0b64db67086f98ceb3942600816eed98046abd6be5ad66f4614a9ca2"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 1674759,
"digest": "sha256:9870f62c5af97178d2b7f26ef09285c407bb8f86e1be9bcf9d82aeb5a036b7f6"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 2445148,
"digest": "sha256:cbb20a312883952b6b42b5f71171308cc5e7a1183bad442878febba39a7ae4c1"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 11138965,
"digest": "sha256:b998c1e6578adab28ed6958da133eeff1b72412d0be30ca5b2dc7603eb906ddb"
},
{
"mediaType": "application/vnd.docker.image.rootfs.diff.tar.gzip",
"size": 616532,
"digest": "sha256:17c2d33598da93c28bc860cff35445cb8335a12d0c2c102ec15bd2fccba5e24b"
}
]
}
}

manifest push

1
2
root@vmnet8cloud:~/bettercap/bettercap# docker manifest push  vmnet8/bettercap:latest
sha256:2b6c7c74af114f187139ff8bdacc61af79a9a1715f03835efb887a77ac16f17d