mirror of
https://github.com/containers/podman.git
synced 2025-06-22 18:08:11 +08:00
Merge pull request #2547 from haircommander/pod_volume_mount
Add volume mounting to podman play kube
This commit is contained in:
@ -25,6 +25,11 @@ import (
|
|||||||
"k8s.io/api/core/v1"
|
"k8s.io/api/core/v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
// https://kubernetes.io/docs/concepts/storage/volumes/#hostpath
|
||||||
|
createDirectoryPermission = 0755
|
||||||
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
playKubeCommand cliconfig.KubePlayValues
|
playKubeCommand cliconfig.KubePlayValues
|
||||||
playKubeDescription = "Play a Pod and its containers based on a Kubrernetes YAML"
|
playKubeDescription = "Play a Pod and its containers based on a Kubrernetes YAML"
|
||||||
@ -144,12 +149,41 @@ func playKubeYAMLCmd(c *cliconfig.KubePlayValues) error {
|
|||||||
dockerRegistryOptions.DockerInsecureSkipTLSVerify = types.NewOptionalBool(!c.TlsVerify)
|
dockerRegistryOptions.DockerInsecureSkipTLSVerify = types.NewOptionalBool(!c.TlsVerify)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// map from name to mount point
|
||||||
|
volumes := make(map[string]string)
|
||||||
|
for _, volume := range podYAML.Spec.Volumes {
|
||||||
|
hostPath := volume.VolumeSource.HostPath
|
||||||
|
if hostPath == nil {
|
||||||
|
return errors.Errorf("HostPath is currently the only supported VolumeSource")
|
||||||
|
}
|
||||||
|
if hostPath.Type != nil {
|
||||||
|
switch *hostPath.Type {
|
||||||
|
case v1.HostPathDirectoryOrCreate:
|
||||||
|
if _, err := os.Stat(hostPath.Path); os.IsNotExist(err) {
|
||||||
|
if err := os.Mkdir(hostPath.Path, createDirectoryPermission); err != nil {
|
||||||
|
return errors.Errorf("Error creating HostPath %s at %s", volume.Name, hostPath.Path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case v1.HostPathDirectory:
|
||||||
|
// do nothing here because we will verify the path exists in validateVolumeHostDir
|
||||||
|
break
|
||||||
|
default:
|
||||||
|
return errors.Errorf("Directories are the only supported HostPath type")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err := validateVolumeHostDir(hostPath.Path); err != nil {
|
||||||
|
return errors.Wrapf(err, "Error in parsing HostPath in YAML")
|
||||||
|
}
|
||||||
|
fmt.Println(volume.Name)
|
||||||
|
volumes[volume.Name] = hostPath.Path
|
||||||
|
}
|
||||||
|
|
||||||
for _, container := range podYAML.Spec.Containers {
|
for _, container := range podYAML.Spec.Containers {
|
||||||
newImage, err := runtime.ImageRuntime().New(ctx, container.Image, c.SignaturePolicy, c.Authfile, writer, &dockerRegistryOptions, image2.SigningOptions{}, false, nil)
|
newImage, err := runtime.ImageRuntime().New(ctx, container.Image, c.SignaturePolicy, c.Authfile, writer, &dockerRegistryOptions, image2.SigningOptions{}, false, nil)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
createConfig := kubeContainerToCreateConfig(container, runtime, newImage, namespaces)
|
createConfig, err := kubeContainerToCreateConfig(container, runtime, newImage, namespaces, volumes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -194,7 +228,7 @@ func getPodPorts(containers []v1.Container) []ocicni.PortMapping {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// kubeContainerToCreateConfig takes a v1.Container and returns a createconfig describing a container
|
// kubeContainerToCreateConfig takes a v1.Container and returns a createconfig describing a container
|
||||||
func kubeContainerToCreateConfig(containerYAML v1.Container, runtime *libpod.Runtime, newImage *image2.Image, namespaces map[string]string) *createconfig.CreateConfig {
|
func kubeContainerToCreateConfig(containerYAML v1.Container, runtime *libpod.Runtime, newImage *image2.Image, namespaces map[string]string, volumes map[string]string) (*createconfig.CreateConfig, error) {
|
||||||
var (
|
var (
|
||||||
containerConfig createconfig.CreateConfig
|
containerConfig createconfig.CreateConfig
|
||||||
envs map[string]string
|
envs map[string]string
|
||||||
@ -239,6 +273,17 @@ func kubeContainerToCreateConfig(containerYAML v1.Container, runtime *libpod.Run
|
|||||||
for _, e := range containerYAML.Env {
|
for _, e := range containerYAML.Env {
|
||||||
envs[e.Name] = e.Value
|
envs[e.Name] = e.Value
|
||||||
}
|
}
|
||||||
containerConfig.Env = envs
|
|
||||||
return &containerConfig
|
for _, volume := range containerYAML.VolumeMounts {
|
||||||
|
host_path, exists := volumes[volume.Name]
|
||||||
|
if !exists {
|
||||||
|
return nil, errors.Errorf("Volume mount %s specified for container but not configured in volumes", volume.Name)
|
||||||
|
}
|
||||||
|
if err := validateVolumeCtrDir(volume.MountPath); err != nil {
|
||||||
|
return nil, errors.Wrapf(err, "error in parsing MountPath")
|
||||||
|
}
|
||||||
|
containerConfig.Volumes = append(containerConfig.Volumes, fmt.Sprintf("%s:%s", host_path, volume.MountPath))
|
||||||
|
}
|
||||||
|
containerConfig.Env = envs
|
||||||
|
return &containerConfig, nil
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user