Add functions to return image informations

Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
This commit is contained in:
Daniel J Walsh
2020-04-18 05:57:18 -04:00
parent 5928e8fe80
commit a2ad5bb9e1
2 changed files with 111 additions and 31 deletions

View File

@ -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
}

View File

@ -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 {