envd icon indicating copy to clipboard operation
envd copied to clipboard

feasibility-research(runtime): Support the OCI runtime spec-compatible runtime

Open gaocegege opened this issue 3 years ago • 15 comments

Description

gaocegege avatar Jun 12 '22 00:06 gaocegege

Can we integrate with OCI runtime spec directly? So that we can work with runc, crun, containerd, kata, ...

Xuanwo avatar Jun 12 '22 01:06 Xuanwo

SGTM.

gaocegege avatar Jun 12 '22 02:06 gaocegege

should we plan to support podman? for Linux users, podman may be their best choice for managing containers and images. also for macOS users, podman is available now. podman can run without a daemon service and sudo permission. supporting podman may increase the user experience by hidding containers under the hood

From #915

/cc @TaylorHere

gaocegege avatar Sep 17 '22 01:09 gaocegege

Any update or progress on this issue?

TaylorHere avatar Sep 17 '22 09:09 TaylorHere

We did not start yet. We are still working on kubernetes support.

gaocegege avatar Sep 17 '22 12:09 gaocegege

https://github.com/opencontainers/runtime-tools/tree/master/generate this package may be a good choice to generate the OCI state

TaylorHere avatar Sep 17 '22 15:09 TaylorHere

I see some tools can work with docker socket and podman socket like jetbrains, maybe OCI is not needed, just a client that can work with those sockets. so, I tried

diff --git a/pkg/buildkitd/buildkitd.go b/pkg/buildkitd/buildkitd.go
index da28703..4ab5282 100644
--- a/pkg/buildkitd/buildkitd.go
+++ b/pkg/buildkitd/buildkitd.go
@@ -113,7 +113,7 @@ func (c generalClient) Close() error {
 // that can be used to connect to it.
 func (c *generalClient) maybeStart(ctx context.Context,
 	runningTimeout, connectingTimeout time.Duration) (string, error) {
-	if c.driver == types.BuilderTypeDocker {
+	if c.driver == types.BuilderTypeDocker || c.driver == types.BuilderTypePodman {
 		dockerClient, err := docker.NewClient(ctx)
 		if err != nil {
 			return "", err
diff --git a/pkg/home/context.go b/pkg/home/context.go
index 6b6f250..b57ad38 100644
--- a/pkg/home/context.go
+++ b/pkg/home/context.go
@@ -96,7 +96,8 @@ func (m *generalManager) ContextCreate(ctx types.Context, use bool) error {
 	}
 	switch ctx.Builder {
 	case types.BuilderTypeDocker, types.BuilderTypeKubernetes,
-		types.BuilderTypeUNIXDomainSocket, types.BuilderTypeTCP:
+		types.BuilderTypeUNIXDomainSocket, types.BuilderTypeTCP,
+		types.BuilderTypePodman:
 		break
 	default:
 		return errors.New("unknown builder type")
diff --git a/pkg/types/envd.go b/pkg/types/envd.go
index c9422b0..dfde360 100644
--- a/pkg/types/envd.go
+++ b/pkg/types/envd.go
@@ -129,6 +129,7 @@ type BuilderType string
 
 const (
 	BuilderTypeDocker           BuilderType = "docker-container"
+	BuilderTypePodman           BuilderType = "podman-container"
 	BuilderTypeKubernetes       BuilderType = "kube-pod"
 	BuilderTypeTCP              BuilderType = "tcp"
 	BuilderTypeUNIXDomainSocket BuilderType = "UNIX"
sudo ln -s /run/podman/podman.sock /var/run/docker.sock
envd context create --name podman --builder podman-container --builder-address envd_buildkitd --use 
envd bootstrap
INFO[2022-11-01T21:00:45+08:00] [1/3] Bootstrap SSH Key                      
INFO[2022-11-01T21:00:45+08:00] [2/3] Bootstrap autocomplete                 
INFO[2022-11-01T21:00:45+08:00] You may have to restart your shell for autocomplete to get initialized (e.g. run "exec $SHELL") 
INFO[2022-11-01T21:00:45+08:00] [3/3] Bootstrap buildkit                     
INFO[2022-11-01T21:00:46+08:00] The buildkit is running at podman-container://envd_buildkitd 

works fine

TaylorHere avatar Nov 01 '22 13:11 TaylorHere

Nice Job. Maybe we need a podman socket CI to test it all.

aseaday avatar Nov 01 '22 13:11 aseaday

Nice Job. Maybe we need a podman socket CI to test it all.

I will try to create a PR on this.

TaylorHere avatar Nov 01 '22 13:11 TaylorHere

bad news, the rootless socket is not working.

TaylorHere avatar Nov 01 '22 13:11 TaylorHere

May I ask why it does not work? Did it return an error?

gaocegege avatar Nov 02 '22 01:11 gaocegege

it looks hung on client.NewClientWithOpts

TaylorHere avatar Nov 02 '22 02:11 TaylorHere

No, my bad, it's working with rootless sockets

DOCKER_HOST=unix:///run/user/1000/podman/podman.sock envd bootstrap 
INFO[2022-11-02T11:01:59+08:00] [1/3] Bootstrap SSH Key                      
INFO[2022-11-02T11:01:59+08:00] [2/3] Bootstrap autocomplete                 
INFO[2022-11-02T11:01:59+08:00] You may have to restart your shell for autocomplete to get initialized (e.g. run "exec $SHELL") 
INFO[2022-11-02T11:01:59+08:00] [3/3] Bootstrap buildkit                     
INFO[2022-11-02T11:02:00+08:00] The buildkit is running at podman-container://envd_buildkitd 

TaylorHere avatar Nov 02 '22 03:11 TaylorHere

Related to https://github.com/tensorchord/envd/issues/1123

gaocegege avatar Nov 02 '22 04:11 gaocegege

No, my bad, it's working with rootless sockets

DOCKER_HOST=unix:///run/user/1000/podman/podman.sock envd bootstrap 
INFO[2022-11-02T11:01:59+08:00] [1/3] Bootstrap SSH Key                      
INFO[2022-11-02T11:01:59+08:00] [2/3] Bootstrap autocomplete                 
INFO[2022-11-02T11:01:59+08:00] You may have to restart your shell for autocomplete to get initialized (e.g. run "exec $SHELL") 
INFO[2022-11-02T11:01:59+08:00] [3/3] Bootstrap buildkit                     
INFO[2022-11-02T11:02:00+08:00] The buildkit is running at podman-container://envd_buildkitd 

buildkit is running successfully in podman. Thanks!

We also need to support creating envd containers in podman.

gaocegege avatar Nov 02 '22 04:11 gaocegege