mirror of
https://github.com/containers/podman.git
synced 2025-05-20 16:47:39 +08:00
Add functions to return image informations
Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
@ -867,22 +867,77 @@ func (i *Image) Intermediate(ctx context.Context) (bool, error) {
|
||||
return false, nil
|
||||
}
|
||||
|
||||
// User returns the image's user
|
||||
func (i *Image) User(ctx context.Context) (string, error) {
|
||||
imgInspect, err := i.inspect(ctx, false)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return imgInspect.Config.User, nil
|
||||
}
|
||||
|
||||
// StopSignal returns the image's StopSignal
|
||||
func (i *Image) StopSignal(ctx context.Context) (string, error) {
|
||||
imgInspect, err := i.inspect(ctx, false)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return imgInspect.Config.StopSignal, nil
|
||||
}
|
||||
|
||||
// WorkingDir returns the image's WorkingDir
|
||||
func (i *Image) WorkingDir(ctx context.Context) (string, error) {
|
||||
imgInspect, err := i.inspect(ctx, false)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return imgInspect.Config.WorkingDir, nil
|
||||
}
|
||||
|
||||
// Cmd returns the image's cmd
|
||||
func (i *Image) Cmd(ctx context.Context) ([]string, error) {
|
||||
imgInspect, err := i.inspect(ctx, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return imgInspect.Config.Cmd, nil
|
||||
}
|
||||
|
||||
// Entrypoint returns the image's entrypoint
|
||||
func (i *Image) Entrypoint(ctx context.Context) ([]string, error) {
|
||||
imgInspect, err := i.inspect(ctx, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return imgInspect.Config.Entrypoint, nil
|
||||
}
|
||||
|
||||
// Env returns the image's env
|
||||
func (i *Image) Env(ctx context.Context) ([]string, error) {
|
||||
imgInspect, err := i.imageInspectInfo(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return imgInspect.Env, nil
|
||||
}
|
||||
|
||||
// Labels returns the image's labels
|
||||
func (i *Image) Labels(ctx context.Context) (map[string]string, error) {
|
||||
imgInspect, err := i.imageInspectInfo(ctx)
|
||||
if err != nil {
|
||||
return nil, nil
|
||||
return nil, err
|
||||
}
|
||||
return imgInspect.Labels, nil
|
||||
}
|
||||
|
||||
// GetLabel Returns a case-insensitive match of a given label
|
||||
func (i *Image) GetLabel(ctx context.Context, label string) (string, error) {
|
||||
imageLabels, err := i.Labels(ctx)
|
||||
labels, err := i.Labels(ctx)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
for k, v := range imageLabels {
|
||||
|
||||
for k, v := range labels {
|
||||
if strings.ToLower(k) == strings.ToLower(label) {
|
||||
return v, nil
|
||||
}
|
||||
|
@ -20,17 +20,27 @@ func CompleteSpec(ctx context.Context, r *libpod.Runtime, s *specgen.SpecGenerat
|
||||
}
|
||||
|
||||
// Image stop signal
|
||||
if s.StopSignal == nil && newImage.Config != nil {
|
||||
sig, err := signal.ParseSignalNameOrNumber(newImage.Config.StopSignal)
|
||||
if s.StopSignal == nil {
|
||||
stopSignal, err := newImage.StopSignal(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
sig, err := signal.ParseSignalNameOrNumber(stopSignal)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
s.StopSignal = &sig
|
||||
}
|
||||
|
||||
// Image envs from the image if they don't exist
|
||||
// already
|
||||
if newImage.Config != nil && len(newImage.Config.Env) > 0 {
|
||||
envs, err := envLib.ParseSlice(newImage.Config.Env)
|
||||
env, err := newImage.Env(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if len(env) > 0 {
|
||||
envs, err := envLib.ParseSlice(env)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -41,12 +51,15 @@ func CompleteSpec(ctx context.Context, r *libpod.Runtime, s *specgen.SpecGenerat
|
||||
}
|
||||
}
|
||||
|
||||
labels, err := newImage.Labels(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// labels from the image that dont exist already
|
||||
if config := newImage.Config; config != nil {
|
||||
for k, v := range config.Labels {
|
||||
if _, exists := s.Labels[k]; !exists {
|
||||
s.Labels[k] = v
|
||||
}
|
||||
for k, v := range labels {
|
||||
if _, exists := s.Labels[k]; !exists {
|
||||
s.Labels[k] = v
|
||||
}
|
||||
}
|
||||
|
||||
@ -75,20 +88,30 @@ func CompleteSpec(ctx context.Context, r *libpod.Runtime, s *specgen.SpecGenerat
|
||||
}
|
||||
|
||||
// entrypoint
|
||||
if config := newImage.Config; config != nil {
|
||||
if len(s.Entrypoint) < 1 && len(config.Entrypoint) > 0 {
|
||||
s.Entrypoint = config.Entrypoint
|
||||
}
|
||||
if len(s.Command) < 1 && len(config.Cmd) > 0 {
|
||||
s.Command = config.Cmd
|
||||
}
|
||||
if len(s.Command) < 1 && len(s.Entrypoint) < 1 {
|
||||
return errors.Errorf("No command provided or as CMD or ENTRYPOINT in this image")
|
||||
}
|
||||
// workdir
|
||||
if len(s.WorkDir) < 1 && len(config.WorkingDir) > 1 {
|
||||
s.WorkDir = config.WorkingDir
|
||||
}
|
||||
entrypoint, err := newImage.Entrypoint(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(s.Entrypoint) < 1 && len(entrypoint) > 0 {
|
||||
s.Entrypoint = entrypoint
|
||||
}
|
||||
command, err := newImage.Cmd(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(s.Command) < 1 && len(command) > 0 {
|
||||
s.Command = command
|
||||
}
|
||||
if len(s.Command) < 1 && len(s.Entrypoint) < 1 {
|
||||
return errors.Errorf("No command provided or as CMD or ENTRYPOINT in this image")
|
||||
}
|
||||
// workdir
|
||||
workingDir, err := newImage.WorkingDir(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(s.WorkDir) < 1 && len(workingDir) > 1 {
|
||||
s.WorkDir = workingDir
|
||||
}
|
||||
|
||||
if len(s.SeccompProfilePath) < 1 {
|
||||
@ -99,15 +122,17 @@ func CompleteSpec(ctx context.Context, r *libpod.Runtime, s *specgen.SpecGenerat
|
||||
s.SeccompProfilePath = p
|
||||
}
|
||||
|
||||
if user := s.User; len(user) == 0 {
|
||||
switch {
|
||||
if len(s.User) == 0 {
|
||||
s.User, err = newImage.User(ctx)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// TODO This should be enabled when namespaces actually work
|
||||
//case usernsMode.IsKeepID():
|
||||
// user = fmt.Sprintf("%d:%d", rootless.GetRootlessUID(), rootless.GetRootlessGID())
|
||||
case newImage.Config == nil || (newImage.Config != nil && len(newImage.Config.User) == 0):
|
||||
if len(s.User) == 0 {
|
||||
s.User = "0"
|
||||
default:
|
||||
s.User = newImage.Config.User
|
||||
}
|
||||
}
|
||||
if err := finishThrottleDevices(s); err != nil {
|
||||
|
Reference in New Issue
Block a user