|
|
|
@ -88,90 +88,102 @@ type ServiceConfig struct {
|
|
|
|
|
Name string `yaml:"-" json:"-"`
|
|
|
|
|
Profiles []string `mapstructure:"profiles" yaml:"profiles,omitempty" json:"profiles,omitempty"`
|
|
|
|
|
|
|
|
|
|
Build *BuildConfig `yaml:",omitempty" json:"build,omitempty"`
|
|
|
|
|
BlkioConfig *BlkioConfig `mapstructure:"blkio_config" yaml:",omitempty" json:"blkio_config,omitempty"`
|
|
|
|
|
CapAdd []string `mapstructure:"cap_add" yaml:"cap_add,omitempty" json:"cap_add,omitempty"`
|
|
|
|
|
CapDrop []string `mapstructure:"cap_drop" yaml:"cap_drop,omitempty" json:"cap_drop,omitempty"`
|
|
|
|
|
CgroupParent string `mapstructure:"cgroup_parent" yaml:"cgroup_parent,omitempty" json:"cgroup_parent,omitempty"`
|
|
|
|
|
CPUCount int64 `mapstructure:"cpu_count" yaml:"cpu_count,omitempty" json:"cpu_count,omitempty"`
|
|
|
|
|
CPUPercent float32 `mapstructure:"cpu_percent" yaml:"cpu_percent,omitempty" json:"cpu_percent,omitempty"`
|
|
|
|
|
CPUPeriod int64 `mapstructure:"cpu_period" yaml:"cpu_period,omitempty" json:"cpu_period,omitempty"`
|
|
|
|
|
CPUQuota int64 `mapstructure:"cpu_quota" yaml:"cpu_quota,omitempty" json:"cpu_quota,omitempty"`
|
|
|
|
|
CPURTPeriod int64 `mapstructure:"cpu_rt_period" yaml:"cpu_rt_period,omitempty" json:"cpu_rt_period,omitempty"`
|
|
|
|
|
CPURTRuntime int64 `mapstructure:"cpu_rt_runtime" yaml:"cpu_rt_runtime,omitempty" json:"cpu_rt_runtime,omitempty"`
|
|
|
|
|
CPUS float32 `mapstructure:"cpus" yaml:"cpus,omitempty" json:"cpus,omitempty"`
|
|
|
|
|
CPUSet string `mapstructure:"cpuset" yaml:"cpuset,omitempty" json:"cpuset,omitempty"`
|
|
|
|
|
CPUShares int64 `mapstructure:"cpu_shares" yaml:"cpu_shares,omitempty" json:"cpu_shares,omitempty"`
|
|
|
|
|
Command ShellCommand `yaml:",omitempty" json:"command,omitempty"`
|
|
|
|
|
Configs []ServiceConfigObjConfig `yaml:",omitempty" json:"configs,omitempty"`
|
|
|
|
|
ContainerName string `mapstructure:"container_name" yaml:"container_name,omitempty" json:"container_name,omitempty"`
|
|
|
|
|
CredentialSpec *CredentialSpecConfig `mapstructure:"credential_spec" yaml:"credential_spec,omitempty" json:"credential_spec,omitempty"`
|
|
|
|
|
DependsOn DependsOnConfig `mapstructure:"depends_on" yaml:"depends_on,omitempty" json:"depends_on,omitempty"`
|
|
|
|
|
Deploy *DeployConfig `yaml:",omitempty" json:"deploy,omitempty"`
|
|
|
|
|
DeviceCgroupRules []string `mapstructure:"device_cgroup_rules" yaml:"device_cgroup_rules,omitempty" json:"device_cgroup_rules,omitempty"`
|
|
|
|
|
Devices []string `yaml:",omitempty" json:"devices,omitempty"`
|
|
|
|
|
DNS StringList `yaml:",omitempty" json:"dns,omitempty"`
|
|
|
|
|
DNSOpts []string `mapstructure:"dns_opt" yaml:"dns_opt,omitempty" json:"dns_opt,omitempty"`
|
|
|
|
|
DNSSearch StringList `mapstructure:"dns_search" yaml:"dns_search,omitempty" json:"dns_search,omitempty"`
|
|
|
|
|
Dockerfile string `yaml:"dockerfile,omitempty" json:"dockerfile,omitempty"`
|
|
|
|
|
DomainName string `mapstructure:"domainname" yaml:"domainname,omitempty" json:"domainname,omitempty"`
|
|
|
|
|
Entrypoint ShellCommand `yaml:",omitempty" json:"entrypoint,omitempty"`
|
|
|
|
|
Environment MappingWithEquals `yaml:",omitempty" json:"environment,omitempty"`
|
|
|
|
|
EnvFile StringList `mapstructure:"env_file" yaml:"env_file,omitempty" json:"env_file,omitempty"`
|
|
|
|
|
Expose StringOrNumberList `yaml:",omitempty" json:"expose,omitempty"`
|
|
|
|
|
Extends ExtendsConfig `yaml:"extends,omitempty" json:"extends,omitempty"`
|
|
|
|
|
ExternalLinks []string `mapstructure:"external_links" yaml:"external_links,omitempty" json:"external_links,omitempty"`
|
|
|
|
|
ExtraHosts HostsList `mapstructure:"extra_hosts" yaml:"extra_hosts,omitempty" json:"extra_hosts,omitempty"`
|
|
|
|
|
GroupAdd []string `mapstructure:"group_add" yaml:"group_add,omitempty" json:"group_add,omitempty"`
|
|
|
|
|
Hostname string `yaml:",omitempty" json:"hostname,omitempty"`
|
|
|
|
|
HealthCheck *HealthCheckConfig `yaml:",omitempty" json:"healthcheck,omitempty"`
|
|
|
|
|
Image string `yaml:",omitempty" json:"image,omitempty"`
|
|
|
|
|
Init *bool `yaml:",omitempty" json:"init,omitempty"`
|
|
|
|
|
Ipc string `yaml:",omitempty" json:"ipc,omitempty"`
|
|
|
|
|
Isolation string `mapstructure:"isolation" yaml:"isolation,omitempty" json:"isolation,omitempty"`
|
|
|
|
|
Labels Labels `yaml:",omitempty" json:"labels,omitempty"`
|
|
|
|
|
CustomLabels Labels `yaml:"-" json:"-"`
|
|
|
|
|
Links []string `yaml:",omitempty" json:"links,omitempty"`
|
|
|
|
|
Logging *LoggingConfig `yaml:",omitempty" json:"logging,omitempty"`
|
|
|
|
|
LogDriver string `mapstructure:"log_driver" yaml:"log_driver,omitempty" json:"log_driver,omitempty"`
|
|
|
|
|
LogOpt map[string]string `mapstructure:"log_opt" yaml:"log_opt,omitempty" json:"log_opt,omitempty"`
|
|
|
|
|
MemLimit UnitBytes `mapstructure:"mem_limit" yaml:"mem_limit,omitempty" json:"mem_limit,omitempty"`
|
|
|
|
|
MemReservation UnitBytes `mapstructure:"mem_reservation" yaml:"mem_reservation,omitempty" json:"mem_reservation,omitempty"`
|
|
|
|
|
MemSwapLimit UnitBytes `mapstructure:"memswap_limit" yaml:"memswap_limit,omitempty" json:"memswap_limit,omitempty"`
|
|
|
|
|
MemSwappiness UnitBytes `mapstructure:"mem_swappiness" yaml:"mem_swappiness,omitempty" json:"mem_swappiness,omitempty"`
|
|
|
|
|
MacAddress string `mapstructure:"mac_address" yaml:"mac_address,omitempty" json:"mac_address,omitempty"`
|
|
|
|
|
Net string `yaml:"net,omitempty" json:"net,omitempty"`
|
|
|
|
|
NetworkMode string `mapstructure:"network_mode" yaml:"network_mode,omitempty" json:"network_mode,omitempty"`
|
|
|
|
|
Networks map[string]*ServiceNetworkConfig `yaml:",omitempty" json:"networks,omitempty"`
|
|
|
|
|
OomKillDisable bool `mapstructure:"oom_kill_disable" yaml:"oom_kill_disable,omitempty" json:"oom_kill_disable,omitempty"`
|
|
|
|
|
OomScoreAdj int64 `mapstructure:"oom_score_adj" yaml:"oom_score_adj,omitempty" json:"oom_score_adj,omitempty"`
|
|
|
|
|
Pid string `yaml:",omitempty" json:"pid,omitempty"`
|
|
|
|
|
PidsLimit int64 `mapstructure:"pids_limit" yaml:"pids_limit,omitempty" json:"pids_limit,omitempty"`
|
|
|
|
|
Platform string `yaml:",omitempty" json:"platform,omitempty"`
|
|
|
|
|
Ports []ServicePortConfig `yaml:",omitempty" json:"ports,omitempty"`
|
|
|
|
|
Privileged bool `yaml:",omitempty" json:"privileged,omitempty"`
|
|
|
|
|
PullPolicy string `mapstructure:"pull_policy" yaml:"pull_policy,omitempty" json:"pull_policy,omitempty"`
|
|
|
|
|
ReadOnly bool `mapstructure:"read_only" yaml:"read_only,omitempty" json:"read_only,omitempty"`
|
|
|
|
|
Restart string `yaml:",omitempty" json:"restart,omitempty"`
|
|
|
|
|
Runtime string `yaml:",omitempty" json:"runtime,omitempty"`
|
|
|
|
|
Scale int `yaml:"-" json:"-"`
|
|
|
|
|
Secrets []ServiceSecretConfig `yaml:",omitempty" json:"secrets,omitempty"`
|
|
|
|
|
SecurityOpt []string `mapstructure:"security_opt" yaml:"security_opt,omitempty" json:"security_opt,omitempty"`
|
|
|
|
|
ShmSize UnitBytes `mapstructure:"shm_size" yaml:"shm_size,omitempty" json:"shm_size,omitempty"`
|
|
|
|
|
StdinOpen bool `mapstructure:"stdin_open" yaml:"stdin_open,omitempty" json:"stdin_open,omitempty"`
|
|
|
|
|
StopGracePeriod *Duration `mapstructure:"stop_grace_period" yaml:"stop_grace_period,omitempty" json:"stop_grace_period,omitempty"`
|
|
|
|
|
StopSignal string `mapstructure:"stop_signal" yaml:"stop_signal,omitempty" json:"stop_signal,omitempty"`
|
|
|
|
|
Sysctls Mapping `yaml:",omitempty" json:"sysctls,omitempty"`
|
|
|
|
|
Tmpfs StringList `yaml:",omitempty" json:"tmpfs,omitempty"`
|
|
|
|
|
Tty bool `mapstructure:"tty" yaml:"tty,omitempty" json:"tty,omitempty"`
|
|
|
|
|
Ulimits map[string]*UlimitsConfig `yaml:",omitempty" json:"ulimits,omitempty"`
|
|
|
|
|
User string `yaml:",omitempty" json:"user,omitempty"`
|
|
|
|
|
UserNSMode string `mapstructure:"userns_mode" yaml:"userns_mode,omitempty" json:"userns_mode,omitempty"`
|
|
|
|
|
Uts string `yaml:"uts,omitempty" json:"uts,omitempty"`
|
|
|
|
|
VolumeDriver string `mapstructure:"volume_driver" yaml:"volume_driver,omitempty" json:"volume_driver,omitempty"`
|
|
|
|
|
Volumes []ServiceVolumeConfig `yaml:",omitempty" json:"volumes,omitempty"`
|
|
|
|
|
VolumesFrom []string `mapstructure:"volumes_from" yaml:"volumes_from,omitempty" json:"volumes_from,omitempty"`
|
|
|
|
|
WorkingDir string `mapstructure:"working_dir" yaml:"working_dir,omitempty" json:"working_dir,omitempty"`
|
|
|
|
|
Build *BuildConfig `yaml:",omitempty" json:"build,omitempty"`
|
|
|
|
|
BlkioConfig *BlkioConfig `mapstructure:"blkio_config" yaml:",omitempty" json:"blkio_config,omitempty"`
|
|
|
|
|
CapAdd []string `mapstructure:"cap_add" yaml:"cap_add,omitempty" json:"cap_add,omitempty"`
|
|
|
|
|
CapDrop []string `mapstructure:"cap_drop" yaml:"cap_drop,omitempty" json:"cap_drop,omitempty"`
|
|
|
|
|
CgroupParent string `mapstructure:"cgroup_parent" yaml:"cgroup_parent,omitempty" json:"cgroup_parent,omitempty"`
|
|
|
|
|
CPUCount int64 `mapstructure:"cpu_count" yaml:"cpu_count,omitempty" json:"cpu_count,omitempty"`
|
|
|
|
|
CPUPercent float32 `mapstructure:"cpu_percent" yaml:"cpu_percent,omitempty" json:"cpu_percent,omitempty"`
|
|
|
|
|
CPUPeriod int64 `mapstructure:"cpu_period" yaml:"cpu_period,omitempty" json:"cpu_period,omitempty"`
|
|
|
|
|
CPUQuota int64 `mapstructure:"cpu_quota" yaml:"cpu_quota,omitempty" json:"cpu_quota,omitempty"`
|
|
|
|
|
CPURTPeriod int64 `mapstructure:"cpu_rt_period" yaml:"cpu_rt_period,omitempty" json:"cpu_rt_period,omitempty"`
|
|
|
|
|
CPURTRuntime int64 `mapstructure:"cpu_rt_runtime" yaml:"cpu_rt_runtime,omitempty" json:"cpu_rt_runtime,omitempty"`
|
|
|
|
|
CPUS float32 `mapstructure:"cpus" yaml:"cpus,omitempty" json:"cpus,omitempty"`
|
|
|
|
|
CPUSet string `mapstructure:"cpuset" yaml:"cpuset,omitempty" json:"cpuset,omitempty"`
|
|
|
|
|
CPUShares int64 `mapstructure:"cpu_shares" yaml:"cpu_shares,omitempty" json:"cpu_shares,omitempty"`
|
|
|
|
|
|
|
|
|
|
// Command for the service containers.
|
|
|
|
|
// If set, overrides COMMAND from the image.
|
|
|
|
|
//
|
|
|
|
|
// Set to `[]` or `''` to clear the command from the image.
|
|
|
|
|
Command ShellCommand `yaml:",omitempty" json:"command"` // NOTE: we can NOT omitempty for JSON! see ShellCommand type for details.
|
|
|
|
|
|
|
|
|
|
Configs []ServiceConfigObjConfig `yaml:",omitempty" json:"configs,omitempty"`
|
|
|
|
|
ContainerName string `mapstructure:"container_name" yaml:"container_name,omitempty" json:"container_name,omitempty"`
|
|
|
|
|
CredentialSpec *CredentialSpecConfig `mapstructure:"credential_spec" yaml:"credential_spec,omitempty" json:"credential_spec,omitempty"`
|
|
|
|
|
DependsOn DependsOnConfig `mapstructure:"depends_on" yaml:"depends_on,omitempty" json:"depends_on,omitempty"`
|
|
|
|
|
Deploy *DeployConfig `yaml:",omitempty" json:"deploy,omitempty"`
|
|
|
|
|
DeviceCgroupRules []string `mapstructure:"device_cgroup_rules" yaml:"device_cgroup_rules,omitempty" json:"device_cgroup_rules,omitempty"`
|
|
|
|
|
Devices []string `yaml:",omitempty" json:"devices,omitempty"`
|
|
|
|
|
DNS StringList `yaml:",omitempty" json:"dns,omitempty"`
|
|
|
|
|
DNSOpts []string `mapstructure:"dns_opt" yaml:"dns_opt,omitempty" json:"dns_opt,omitempty"`
|
|
|
|
|
DNSSearch StringList `mapstructure:"dns_search" yaml:"dns_search,omitempty" json:"dns_search,omitempty"`
|
|
|
|
|
Dockerfile string `yaml:"dockerfile,omitempty" json:"dockerfile,omitempty"`
|
|
|
|
|
DomainName string `mapstructure:"domainname" yaml:"domainname,omitempty" json:"domainname,omitempty"`
|
|
|
|
|
|
|
|
|
|
// Entrypoint for the service containers.
|
|
|
|
|
// If set, overrides ENTRYPOINT from the image.
|
|
|
|
|
//
|
|
|
|
|
// Set to `[]` or `''` to clear the entrypoint from the image.
|
|
|
|
|
Entrypoint ShellCommand `yaml:"entrypoint,omitempty" json:"entrypoint"` // NOTE: we can NOT omitempty for JSON! see ShellCommand type for details.
|
|
|
|
|
|
|
|
|
|
Environment MappingWithEquals `yaml:",omitempty" json:"environment,omitempty"`
|
|
|
|
|
EnvFile StringList `mapstructure:"env_file" yaml:"env_file,omitempty" json:"env_file,omitempty"`
|
|
|
|
|
Expose StringOrNumberList `yaml:",omitempty" json:"expose,omitempty"`
|
|
|
|
|
Extends ExtendsConfig `yaml:"extends,omitempty" json:"extends,omitempty"`
|
|
|
|
|
ExternalLinks []string `mapstructure:"external_links" yaml:"external_links,omitempty" json:"external_links,omitempty"`
|
|
|
|
|
ExtraHosts HostsList `mapstructure:"extra_hosts" yaml:"extra_hosts,omitempty" json:"extra_hosts,omitempty"`
|
|
|
|
|
GroupAdd []string `mapstructure:"group_add" yaml:"group_add,omitempty" json:"group_add,omitempty"`
|
|
|
|
|
Hostname string `yaml:",omitempty" json:"hostname,omitempty"`
|
|
|
|
|
HealthCheck *HealthCheckConfig `yaml:",omitempty" json:"healthcheck,omitempty"`
|
|
|
|
|
Image string `yaml:",omitempty" json:"image,omitempty"`
|
|
|
|
|
Init *bool `yaml:",omitempty" json:"init,omitempty"`
|
|
|
|
|
Ipc string `yaml:",omitempty" json:"ipc,omitempty"`
|
|
|
|
|
Isolation string `mapstructure:"isolation" yaml:"isolation,omitempty" json:"isolation,omitempty"`
|
|
|
|
|
Labels Labels `yaml:",omitempty" json:"labels,omitempty"`
|
|
|
|
|
CustomLabels Labels `yaml:"-" json:"-"`
|
|
|
|
|
Links []string `yaml:",omitempty" json:"links,omitempty"`
|
|
|
|
|
Logging *LoggingConfig `yaml:",omitempty" json:"logging,omitempty"`
|
|
|
|
|
LogDriver string `mapstructure:"log_driver" yaml:"log_driver,omitempty" json:"log_driver,omitempty"`
|
|
|
|
|
LogOpt map[string]string `mapstructure:"log_opt" yaml:"log_opt,omitempty" json:"log_opt,omitempty"`
|
|
|
|
|
MemLimit UnitBytes `mapstructure:"mem_limit" yaml:"mem_limit,omitempty" json:"mem_limit,omitempty"`
|
|
|
|
|
MemReservation UnitBytes `mapstructure:"mem_reservation" yaml:"mem_reservation,omitempty" json:"mem_reservation,omitempty"`
|
|
|
|
|
MemSwapLimit UnitBytes `mapstructure:"memswap_limit" yaml:"memswap_limit,omitempty" json:"memswap_limit,omitempty"`
|
|
|
|
|
MemSwappiness UnitBytes `mapstructure:"mem_swappiness" yaml:"mem_swappiness,omitempty" json:"mem_swappiness,omitempty"`
|
|
|
|
|
MacAddress string `mapstructure:"mac_address" yaml:"mac_address,omitempty" json:"mac_address,omitempty"`
|
|
|
|
|
Net string `yaml:"net,omitempty" json:"net,omitempty"`
|
|
|
|
|
NetworkMode string `mapstructure:"network_mode" yaml:"network_mode,omitempty" json:"network_mode,omitempty"`
|
|
|
|
|
Networks map[string]*ServiceNetworkConfig `yaml:",omitempty" json:"networks,omitempty"`
|
|
|
|
|
OomKillDisable bool `mapstructure:"oom_kill_disable" yaml:"oom_kill_disable,omitempty" json:"oom_kill_disable,omitempty"`
|
|
|
|
|
OomScoreAdj int64 `mapstructure:"oom_score_adj" yaml:"oom_score_adj,omitempty" json:"oom_score_adj,omitempty"`
|
|
|
|
|
Pid string `yaml:",omitempty" json:"pid,omitempty"`
|
|
|
|
|
PidsLimit int64 `mapstructure:"pids_limit" yaml:"pids_limit,omitempty" json:"pids_limit,omitempty"`
|
|
|
|
|
Platform string `yaml:",omitempty" json:"platform,omitempty"`
|
|
|
|
|
Ports []ServicePortConfig `yaml:",omitempty" json:"ports,omitempty"`
|
|
|
|
|
Privileged bool `yaml:",omitempty" json:"privileged,omitempty"`
|
|
|
|
|
PullPolicy string `mapstructure:"pull_policy" yaml:"pull_policy,omitempty" json:"pull_policy,omitempty"`
|
|
|
|
|
ReadOnly bool `mapstructure:"read_only" yaml:"read_only,omitempty" json:"read_only,omitempty"`
|
|
|
|
|
Restart string `yaml:",omitempty" json:"restart,omitempty"`
|
|
|
|
|
Runtime string `yaml:",omitempty" json:"runtime,omitempty"`
|
|
|
|
|
Scale int `yaml:"-" json:"-"`
|
|
|
|
|
Secrets []ServiceSecretConfig `yaml:",omitempty" json:"secrets,omitempty"`
|
|
|
|
|
SecurityOpt []string `mapstructure:"security_opt" yaml:"security_opt,omitempty" json:"security_opt,omitempty"`
|
|
|
|
|
ShmSize UnitBytes `mapstructure:"shm_size" yaml:"shm_size,omitempty" json:"shm_size,omitempty"`
|
|
|
|
|
StdinOpen bool `mapstructure:"stdin_open" yaml:"stdin_open,omitempty" json:"stdin_open,omitempty"`
|
|
|
|
|
StopGracePeriod *Duration `mapstructure:"stop_grace_period" yaml:"stop_grace_period,omitempty" json:"stop_grace_period,omitempty"`
|
|
|
|
|
StopSignal string `mapstructure:"stop_signal" yaml:"stop_signal,omitempty" json:"stop_signal,omitempty"`
|
|
|
|
|
Sysctls Mapping `yaml:",omitempty" json:"sysctls,omitempty"`
|
|
|
|
|
Tmpfs StringList `yaml:",omitempty" json:"tmpfs,omitempty"`
|
|
|
|
|
Tty bool `mapstructure:"tty" yaml:"tty,omitempty" json:"tty,omitempty"`
|
|
|
|
|
Ulimits map[string]*UlimitsConfig `yaml:",omitempty" json:"ulimits,omitempty"`
|
|
|
|
|
User string `yaml:",omitempty" json:"user,omitempty"`
|
|
|
|
|
UserNSMode string `mapstructure:"userns_mode" yaml:"userns_mode,omitempty" json:"userns_mode,omitempty"`
|
|
|
|
|
Uts string `yaml:"uts,omitempty" json:"uts,omitempty"`
|
|
|
|
|
VolumeDriver string `mapstructure:"volume_driver" yaml:"volume_driver,omitempty" json:"volume_driver,omitempty"`
|
|
|
|
|
Volumes []ServiceVolumeConfig `yaml:",omitempty" json:"volumes,omitempty"`
|
|
|
|
|
VolumesFrom []string `mapstructure:"volumes_from" yaml:"volumes_from,omitempty" json:"volumes_from,omitempty"`
|
|
|
|
|
WorkingDir string `mapstructure:"working_dir" yaml:"working_dir,omitempty" json:"working_dir,omitempty"`
|
|
|
|
|
|
|
|
|
|
Extensions map[string]interface{} `yaml:",inline" json:"-"`
|
|
|
|
|
}
|
|
|
|
@ -306,6 +318,7 @@ type BuildConfig struct {
|
|
|
|
|
Target string `yaml:",omitempty" json:"target,omitempty"`
|
|
|
|
|
Secrets []ServiceSecretConfig `yaml:",omitempty" json:"secrets,omitempty"`
|
|
|
|
|
Tags StringList `mapstructure:"tags" yaml:"tags,omitempty" json:"tags,omitempty"`
|
|
|
|
|
Platforms StringList `mapstructure:"platforms" yaml:"platforms,omitempty" json:"platforms,omitempty"`
|
|
|
|
|
|
|
|
|
|
Extensions map[string]interface{} `yaml:",inline" json:"-"`
|
|
|
|
|
}
|
|
|
|
@ -338,9 +351,55 @@ type ThrottleDevice struct {
|
|
|
|
|
Extensions map[string]interface{} `yaml:",inline" json:"-"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ShellCommand is a string or list of string args
|
|
|
|
|
// ShellCommand is a string or list of string args.
|
|
|
|
|
//
|
|
|
|
|
// When marshaled to YAML, nil command fields will be omitted if `omitempty`
|
|
|
|
|
// is specified as a struct tag. Explicitly empty commands (i.e. `[]` or `''`)
|
|
|
|
|
// will serialize to an empty array (`[]`).
|
|
|
|
|
//
|
|
|
|
|
// When marshaled to JSON, the `omitempty` struct must NOT be specified.
|
|
|
|
|
// If the command field is nil, it will be serialized as `null`.
|
|
|
|
|
// Explicitly empty commands (i.e. `[]` or `''`) will serialize to an empty
|
|
|
|
|
// array (`[]`).
|
|
|
|
|
//
|
|
|
|
|
// The distinction between nil and explicitly empty is important to distinguish
|
|
|
|
|
// between an unset value and a provided, but empty, value, which should be
|
|
|
|
|
// preserved so that it can override any base value (e.g. container entrypoint).
|
|
|
|
|
//
|
|
|
|
|
// The different semantics between YAML and JSON are due to limitations with
|
|
|
|
|
// JSON marshaling + `omitempty` in the Go stdlib, while gopkg.in/yaml.v2 gives
|
|
|
|
|
// us more flexibility via the yaml.IsZeroer interface.
|
|
|
|
|
//
|
|
|
|
|
// In the future, it might make sense to make fields of this type be
|
|
|
|
|
// `*ShellCommand` to avoid this situation, but that would constitute a
|
|
|
|
|
// breaking change.
|
|
|
|
|
type ShellCommand []string
|
|
|
|
|
|
|
|
|
|
// IsZero returns true if the slice is nil.
|
|
|
|
|
//
|
|
|
|
|
// Empty (but non-nil) slices are NOT considered zero values.
|
|
|
|
|
func (s ShellCommand) IsZero() bool {
|
|
|
|
|
// we do NOT want len(s) == 0, ONLY explicitly nil
|
|
|
|
|
return s == nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// MarshalYAML returns nil (which will be serialized as `null`) for nil slices
|
|
|
|
|
// and delegates to the standard marshaller behavior otherwise.
|
|
|
|
|
//
|
|
|
|
|
// NOTE: Typically the nil case here is not hit because IsZero has already
|
|
|
|
|
// short-circuited marshalling, but this ensures that the type serializes
|
|
|
|
|
// accurately if the `omitempty` struct tag is omitted/forgotten.
|
|
|
|
|
//
|
|
|
|
|
// A similar MarshalJSON() implementation is not needed because the Go stdlib
|
|
|
|
|
// already serializes nil slices to `null`, whereas gopkg.in/yaml.v2 by default
|
|
|
|
|
// serializes nil slices to `[]`.
|
|
|
|
|
func (s ShellCommand) MarshalYAML() (interface{}, error) {
|
|
|
|
|
if s == nil {
|
|
|
|
|
return nil, nil
|
|
|
|
|
}
|
|
|
|
|
return []string(s), nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// StringList is a type for fields that can be a string or list of strings
|
|
|
|
|
type StringList []string
|
|
|
|
|
|
|
|
|
|