@@ -21,85 +21,71 @@ import (
21
21
"io"
22
22
"os"
23
23
"os/exec"
24
- "strings"
25
24
26
- "github.com/docker/machine/libmachine/drivers"
27
- "github.com/docker/machine/libmachine/ssh"
28
25
"github.com/spf13/cobra"
29
26
"k8s.io/minikube/pkg/drivers/kic/oci"
30
27
"k8s.io/minikube/pkg/minikube/command"
31
28
"k8s.io/minikube/pkg/minikube/constants"
32
29
"k8s.io/minikube/pkg/minikube/driver"
33
30
"k8s.io/minikube/pkg/minikube/exit"
31
+ "k8s.io/minikube/pkg/minikube/localpath"
34
32
"k8s.io/minikube/pkg/minikube/mustload"
35
33
"k8s.io/minikube/pkg/minikube/out"
36
34
"k8s.io/minikube/pkg/minikube/reason"
37
35
"k8s.io/minikube/pkg/minikube/shell"
38
36
)
39
37
40
- var podmanEnv1Tmpl = fmt .Sprintf (
41
- "{{ .Prefix }}%s{{ .Delimiter }}{{ .VarlinkBridge }}{{ .Suffix }}" +
42
- "{{ .Prefix }}%s{{ .Delimiter }}{{ .MinikubePodmanProfile }}{{ .Suffix }}" +
43
- "{{ .UsageHint }}" ,
44
- constants .PodmanVarlinkBridgeEnv ,
45
- constants .MinikubeActivePodmanEnv )
46
-
47
- var podmanEnv2Tmpl = fmt .Sprintf (
48
- "{{ .Prefix }}%s{{ .Delimiter }}{{ .ContainerHost }}{{ .Suffix }}" +
49
- "{{ if .ContainerSSHKey }}" +
50
- "{{ .Prefix }}%s{{ .Delimiter }}{{ .ContainerSSHKey}}{{ .Suffix }}" +
38
+ var podmanEnvTmpl = fmt .Sprintf (
39
+ "{{ .Prefix }}%s{{ .Delimiter }}{{ .DockerHost }}{{ .Suffix }}" +
40
+ "{{ if .DockerTLSVerify }}" +
41
+ "{{ .Prefix }}%s{{ .Delimiter }}{{ .DockerTLSVerify }}{{ .Suffix }}" +
42
+ "{{ end }}" +
43
+ "{{ if .DockerCertPath }}" +
44
+ "{{ .Prefix }}%s{{ .Delimiter }}{{ .DockerCertPath }}{{ .Suffix }}" +
51
45
"{{ end }}" +
52
- "{{ if .ExistingContainerHost }}" +
53
- "{{ .Prefix }}%s{{ .Delimiter }}{{ .ExistingContainerHost }}{{ .Suffix }}" +
46
+ "{{ if .ExistingDockerHost }}" +
47
+ "{{ .Prefix }}%s{{ .Delimiter }}{{ .ExistingDockerHost }}{{ .Suffix }}" +
54
48
"{{ end }}" +
55
49
"{{ .Prefix }}%s{{ .Delimiter }}{{ .MinikubePodmanProfile }}{{ .Suffix }}" +
56
50
"{{ .UsageHint }}" ,
57
- constants .PodmanContainerHostEnv ,
58
- constants .PodmanContainerSSHKeyEnv ,
59
- constants .ExistingContainerHostEnv ,
51
+ constants .DockerHostEnv ,
52
+ constants .DockerTLSVerifyEnv ,
53
+ constants .DockerCertPathEnv ,
54
+ constants .ExistingDockerHostEnv ,
60
55
constants .MinikubeActivePodmanEnv )
61
56
62
57
// PodmanShellConfig represents the shell config for Podman
63
58
type PodmanShellConfig struct {
64
59
shell.Config
65
- VarlinkBridge string
66
- ContainerHost string
67
- ContainerSSHKey string
60
+ DockerHost string
61
+ DockerTLSVerify string
62
+ DockerCertPath string
68
63
MinikubePodmanProfile string
69
64
70
- ExistingContainerHost string
65
+ ExistingDockerHost string
71
66
}
72
67
73
68
var podmanUnset bool
74
69
75
70
// podmanShellCfgSet generates context variables for "podman-env"
76
71
func podmanShellCfgSet (ec PodmanEnvConfig , envMap map [string ]string ) * PodmanShellConfig {
77
72
profile := ec .profile
78
- const usgPlz = "To point your shell to minikube's podman service, run:"
73
+ const usgPlz = "To point your shell to minikube's podman docker-compatible service, run:"
79
74
usgCmd := fmt .Sprintf ("minikube -p %s podman-env" , profile )
80
75
s := & PodmanShellConfig {
81
76
Config : * shell .CfgSet (ec .EnvConfig , usgPlz , usgCmd ),
82
77
}
83
- s .VarlinkBridge = envMap [constants .PodmanVarlinkBridgeEnv ]
84
- s .ContainerHost = envMap [constants .PodmanContainerHostEnv ]
85
- s .ContainerSSHKey = envMap [constants .PodmanContainerSSHKeyEnv ]
78
+ s .DockerHost = envMap [constants .DockerHostEnv ]
79
+ s .DockerTLSVerify = envMap [constants .DockerTLSVerifyEnv ]
80
+ s .DockerCertPath = envMap [constants .DockerCertPathEnv ]
86
81
87
- s .ExistingContainerHost = envMap [constants .ExistingContainerHostEnv ]
82
+ s .ExistingDockerHost = envMap [constants .ExistingDockerHostEnv ]
88
83
89
84
s .MinikubePodmanProfile = envMap [constants .MinikubeActivePodmanEnv ]
90
85
91
86
return s
92
87
}
93
88
94
- // isVarlinkAvailable checks if varlink command is available
95
- func isVarlinkAvailable (r command.Runner ) bool {
96
- if _ , err := r .RunCmd (exec .Command ("which" , "varlink" )); err != nil {
97
- return false
98
- }
99
-
100
- return true
101
- }
102
-
103
89
// isPodmanAvailable checks if podman command is available
104
90
func isPodmanAvailable (r command.Runner ) bool {
105
91
if _ , err := r .RunCmd (exec .Command ("which" , "podman" )); err != nil {
@@ -109,35 +95,11 @@ func isPodmanAvailable(r command.Runner) bool {
109
95
return true
110
96
}
111
97
112
- func createExternalSSHClient (d drivers.Driver ) (* ssh.ExternalClient , error ) {
113
- sshBinaryPath , err := exec .LookPath ("ssh" )
114
- if err != nil {
115
- return & ssh.ExternalClient {}, err
116
- }
117
-
118
- addr , err := d .GetSSHHostname ()
119
- if err != nil {
120
- return & ssh.ExternalClient {}, err
121
- }
122
-
123
- port , err := d .GetSSHPort ()
124
- if err != nil {
125
- return & ssh.ExternalClient {}, err
126
- }
127
-
128
- auth := & ssh.Auth {}
129
- if d .GetSSHKeyPath () != "" {
130
- auth .Keys = []string {d .GetSSHKeyPath ()}
131
- }
132
-
133
- return ssh .NewExternalClient (sshBinaryPath , d .GetSSHUsername (), addr , port , auth )
134
- }
135
-
136
98
// podmanEnvCmd represents the podman-env command
137
99
var podmanEnvCmd = & cobra.Command {
138
100
Use : "podman-env" ,
139
101
Short : "Configure environment to use minikube's Podman service" ,
140
- Long : `Sets up podman env variables; similar to '$(podman-machine env)' .` ,
102
+ Long : `Sets up Docker client env variables to use minikube's Podman Docker-compatible service .` ,
141
103
Run : func (_ * cobra.Command , _ []string ) {
142
104
sh := shell.EnvConfig {
143
105
Shell : shell .ForceShell ,
@@ -177,37 +139,38 @@ var podmanEnvCmd = &cobra.Command{
177
139
exit .Message (reason .EnvPodmanUnavailable , `The podman service within '{{.cluster}}' is not active` , out.V {"cluster" : cname })
178
140
}
179
141
180
- varlink := isVarlinkAvailable (r )
181
-
182
142
d := co .CP .Host .Driver
183
- client , err := createExternalSSHClient (d )
184
- if err != nil {
185
- exit .Error (reason .IfSSHClient , "Error getting ssh client" , err )
186
- }
187
-
188
- hostname , err := d .GetSSHHostname ()
189
- if err != nil {
190
- exit .Error (reason .IfSSHClient , "Error getting ssh client" , err )
191
- }
192
-
193
- port , err := d .GetSSHPort ()
194
- if err != nil {
195
- exit .Error (reason .IfSSHClient , "Error getting ssh client" , err )
143
+ hostIP := co .CP .IP .String ()
144
+
145
+ // Use Docker API compatibility - podman supports Docker API on port 2376
146
+ port := constants .DockerDaemonPort
147
+ noProxy := false
148
+
149
+ // Check if we need to use SSH tunnel for remote access
150
+ sshHost := false
151
+ if driver .NeedsPortForward (driverName ) {
152
+ sshHost = true
153
+ sshPort , err := d .GetSSHPort ()
154
+ if err != nil {
155
+ exit .Error (reason .IfSSHClient , "Error getting ssh port" , err )
156
+ }
157
+ hostIP = "127.0.0.1"
158
+ _ = sshPort // We'll use SSH tunnel if needed
196
159
}
197
160
198
161
ec := PodmanEnvConfig {
199
162
EnvConfig : sh ,
200
163
profile : cname ,
201
164
driver : driverName ,
202
- varlink : varlink ,
203
- client : client ,
204
- username : d .GetSSHUsername (),
205
- hostname : hostname ,
165
+ ssh : sshHost ,
166
+ hostIP : hostIP ,
206
167
port : port ,
207
- keypath : d .GetSSHKeyPath (),
168
+ certsDir : localpath .MakeMiniPath ("certs" ),
169
+ noProxy : noProxy ,
208
170
}
209
171
210
172
if ec .Shell == "" {
173
+ var err error
211
174
ec .Shell , err = shell .Detect ()
212
175
if err != nil {
213
176
exit .Error (reason .InternalShellDetect , "Error detecting shell" , err )
@@ -225,22 +188,15 @@ type PodmanEnvConfig struct {
225
188
shell.EnvConfig
226
189
profile string
227
190
driver string
228
- varlink bool
229
- client * ssh.ExternalClient
230
- username string
231
- hostname string
191
+ ssh bool
192
+ hostIP string
232
193
port int
233
- keypath string
194
+ certsDir string
195
+ noProxy bool
234
196
}
235
197
236
198
// podmanSetScript writes out a shell-compatible 'podman-env' script
237
199
func podmanSetScript (ec PodmanEnvConfig , w io.Writer ) error {
238
- var podmanEnvTmpl string
239
- if ec .varlink {
240
- podmanEnvTmpl = podmanEnv1Tmpl
241
- } else {
242
- podmanEnvTmpl = podmanEnv2Tmpl
243
- }
244
200
envVars := podmanEnvVars (ec )
245
201
return shell .SetScript (w , podmanEnvTmpl , podmanShellCfgSet (ec , envVars ))
246
202
}
@@ -251,85 +207,43 @@ func podmanUnsetScript(ec PodmanEnvConfig, w io.Writer) error {
251
207
return shell .UnsetScript (ec .EnvConfig , w , vars )
252
208
}
253
209
254
- // podmanBridge returns the command to use in a var for accessing the podman varlink bridge over ssh
255
- func podmanBridge (client * ssh.ExternalClient ) string {
256
- cmd := []string {client .BinaryPath }
257
- cmd = append (cmd , client .BaseArgs ... )
258
- cmd = append (cmd , "--" , "sudo" , "varlink" , "-A" , `\'podman varlink \\\$VARLINK_ADDRESS\'` , "bridge" )
259
- return strings .Join (cmd , " " )
260
- }
261
-
262
- // podmanURL returns the url to use in a var for accessing the podman socket over ssh
263
- func podmanURL (username string , hostname string , port int ) string {
264
- path := "/run/podman/podman.sock"
265
- return fmt .Sprintf ("ssh://%s@%s:%d%s" , username , hostname , port , path )
266
- }
267
210
268
- // podmanEnvVars gets the necessary podman env variables to allow the use of minikube's podman service
211
+ // podmanEnvVars gets the necessary Docker-compatible env variables for podman service
269
212
func podmanEnvVars (ec PodmanEnvConfig ) map [string ]string {
270
- // podman v1
271
- env1 := map [string ]string {
272
- constants .PodmanVarlinkBridgeEnv : podmanBridge (ec .client ),
273
- }
274
- // podman v2
275
- env2 := map [string ]string {
276
- constants .PodmanContainerHostEnv : podmanURL (ec .username , ec .hostname , ec .port ),
277
- constants .PodmanContainerSSHKeyEnv : ec .keypath ,
278
- }
279
- // common
280
- env0 := map [string ]string {
281
- constants .MinikubeActivePodmanEnv : ec .profile ,
282
- }
283
-
284
- var env map [string ]string
285
- if ec .varlink {
286
- env = env1
213
+ var rt string
214
+ if ec .ssh {
215
+ rt = fmt .Sprintf ("tcp://%s:%d" , ec .hostIP , ec .port )
287
216
} else {
288
- env = env2
217
+ rt = fmt . Sprintf ( "tcp://%s:%d" , ec . hostIP , ec . port )
289
218
}
290
- for k , v := range env0 {
291
- env [k ] = v
219
+
220
+ env := map [string ]string {
221
+ constants .DockerHostEnv : rt ,
222
+ constants .DockerTLSVerifyEnv : "1" ,
223
+ constants .DockerCertPathEnv : ec .certsDir ,
224
+ constants .MinikubeActivePodmanEnv : ec .profile ,
292
225
}
226
+
227
+ // Save existing Docker env if not already using minikube
293
228
if os .Getenv (constants .MinikubeActivePodmanEnv ) == "" {
294
- e := constants .PodmanContainerHostEnv
295
- if v := oci .InitialEnv (e ); v != "" {
296
- key := constants .ExistingContainerHostEnv
297
- env [key ] = v
229
+ for _ , envVar := range constants .DockerDaemonEnvs {
230
+ if v := oci .InitialEnv (envVar ); v != "" {
231
+ key := constants .MinikubeExistingPrefix + envVar
232
+ env [key ] = v
233
+ }
298
234
}
299
235
}
300
236
return env
301
237
}
302
238
303
- // podmanEnvNames gets the necessary podman env variables to reset after using minikube's podman service
239
+ // podmanEnvNames gets the necessary Docker env variables to reset after using minikube's podman service
304
240
func podmanEnvNames (ec PodmanEnvConfig ) []string {
305
- // podman v1
306
- vars1 := []string {
307
- constants .PodmanVarlinkBridgeEnv ,
308
- }
309
- // podman v2
310
- vars2 := []string {
311
- constants .PodmanContainerHostEnv ,
312
- constants .PodmanContainerSSHKeyEnv ,
313
- }
314
- // common
315
- vars0 := []string {
241
+ vars := []string {
242
+ constants .DockerHostEnv ,
243
+ constants .DockerTLSVerifyEnv ,
244
+ constants .DockerCertPathEnv ,
316
245
constants .MinikubeActivePodmanEnv ,
317
246
}
318
-
319
- var vars []string
320
- if ec .client != nil || ec .hostname != "" {
321
- // getting ec.varlink needs a running machine
322
- if ec .varlink {
323
- vars = vars1
324
- } else {
325
- vars = vars2
326
- }
327
- } else {
328
- // just unset *all* of the variables instead
329
- vars = vars1
330
- vars = append (vars , vars2 ... )
331
- }
332
- vars = append (vars , vars0 ... )
333
247
return vars
334
248
}
335
249
0 commit comments