mirror of https://github.com/docker/cli.git
Add --init option to `docker service create`
Signed-off-by: Timothy Higinbottom <timhigins@gmail.com> Signed-off-by: Vincent Demeester <vincent@sbr.pm>
This commit is contained in:
parent
4cb3c70f36
commit
ff13f03def
|
@ -85,6 +85,9 @@ ContainerSpec:
|
||||||
{{- if .ContainerWorkDir }}
|
{{- if .ContainerWorkDir }}
|
||||||
Dir: {{ .ContainerWorkDir }}
|
Dir: {{ .ContainerWorkDir }}
|
||||||
{{- end -}}
|
{{- end -}}
|
||||||
|
{{- if .HasContainerInit }}
|
||||||
|
Init: {{ .ContainerInit }}
|
||||||
|
{{- end -}}
|
||||||
{{- if .ContainerUser }}
|
{{- if .ContainerUser }}
|
||||||
User: {{ .ContainerUser }}
|
User: {{ .ContainerUser }}
|
||||||
{{- end }}
|
{{- end }}
|
||||||
|
@ -372,6 +375,14 @@ func (ctx *serviceInspectContext) ContainerUser() string {
|
||||||
return ctx.Service.Spec.TaskTemplate.ContainerSpec.User
|
return ctx.Service.Spec.TaskTemplate.ContainerSpec.User
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ctx *serviceInspectContext) HasContainerInit() bool {
|
||||||
|
return ctx.Service.Spec.TaskTemplate.ContainerSpec.Init != nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ctx *serviceInspectContext) ContainerInit() bool {
|
||||||
|
return *ctx.Service.Spec.TaskTemplate.ContainerSpec.Init
|
||||||
|
}
|
||||||
|
|
||||||
func (ctx *serviceInspectContext) ContainerMounts() []mounttypes.Mount {
|
func (ctx *serviceInspectContext) ContainerMounts() []mounttypes.Mount {
|
||||||
return ctx.Service.Spec.TaskTemplate.ContainerSpec.Mounts
|
return ctx.Service.Spec.TaskTemplate.ContainerSpec.Mounts
|
||||||
}
|
}
|
||||||
|
|
|
@ -58,6 +58,8 @@ func newCreateCommand(dockerCli command.Cli) *cobra.Command {
|
||||||
flags.SetAnnotation(flagDNSSearch, "version", []string{"1.25"})
|
flags.SetAnnotation(flagDNSSearch, "version", []string{"1.25"})
|
||||||
flags.Var(&opts.hosts, flagHost, "Set one or more custom host-to-IP mappings (host:ip)")
|
flags.Var(&opts.hosts, flagHost, "Set one or more custom host-to-IP mappings (host:ip)")
|
||||||
flags.SetAnnotation(flagHost, "version", []string{"1.25"})
|
flags.SetAnnotation(flagHost, "version", []string{"1.25"})
|
||||||
|
flags.BoolVar(&opts.init, flagInit, false, "Use an init inside each service container to forward signals and reap processes")
|
||||||
|
flags.SetAnnotation(flagInit, "version", []string{"1.37"})
|
||||||
|
|
||||||
flags.Var(cliopts.NewListOptsRef(&opts.resources.resGenericResources, ValidateSingleGenericResource), "generic-resource", "User defined resources")
|
flags.Var(cliopts.NewListOptsRef(&opts.resources.resGenericResources, ValidateSingleGenericResource), "generic-resource", "User defined resources")
|
||||||
flags.SetAnnotation(flagHostAdd, "version", []string{"1.32"})
|
flags.SetAnnotation(flagHostAdd, "version", []string{"1.32"})
|
||||||
|
|
|
@ -480,6 +480,7 @@ type serviceOptions struct {
|
||||||
user string
|
user string
|
||||||
groups opts.ListOpts
|
groups opts.ListOpts
|
||||||
credentialSpec credentialSpecOpt
|
credentialSpec credentialSpecOpt
|
||||||
|
init bool
|
||||||
stopSignal string
|
stopSignal string
|
||||||
tty bool
|
tty bool
|
||||||
readOnly bool
|
readOnly bool
|
||||||
|
@ -624,6 +625,7 @@ func (options *serviceOptions) ToService(ctx context.Context, apiClient client.N
|
||||||
TTY: options.tty,
|
TTY: options.tty,
|
||||||
ReadOnly: options.readOnly,
|
ReadOnly: options.readOnly,
|
||||||
Mounts: options.mounts.Value(),
|
Mounts: options.mounts.Value(),
|
||||||
|
Init: &options.init,
|
||||||
DNSConfig: &swarm.DNSConfig{
|
DNSConfig: &swarm.DNSConfig{
|
||||||
Nameservers: options.dns.GetAll(),
|
Nameservers: options.dns.GetAll(),
|
||||||
Search: options.dnsSearch.GetAll(),
|
Search: options.dnsSearch.GetAll(),
|
||||||
|
@ -875,6 +877,7 @@ const (
|
||||||
flagRollbackMonitor = "rollback-monitor"
|
flagRollbackMonitor = "rollback-monitor"
|
||||||
flagRollbackOrder = "rollback-order"
|
flagRollbackOrder = "rollback-order"
|
||||||
flagRollbackParallelism = "rollback-parallelism"
|
flagRollbackParallelism = "rollback-parallelism"
|
||||||
|
flagInit = "init"
|
||||||
flagStopGracePeriod = "stop-grace-period"
|
flagStopGracePeriod = "stop-grace-period"
|
||||||
flagStopSignal = "stop-signal"
|
flagStopSignal = "stop-signal"
|
||||||
flagTTY = "tty"
|
flagTTY = "tty"
|
||||||
|
|
|
@ -94,6 +94,8 @@ func newUpdateCommand(dockerCli command.Cli) *cobra.Command {
|
||||||
flags.SetAnnotation(flagDNSSearchAdd, "version", []string{"1.25"})
|
flags.SetAnnotation(flagDNSSearchAdd, "version", []string{"1.25"})
|
||||||
flags.Var(&options.hosts, flagHostAdd, "Add a custom host-to-IP mapping (host:ip)")
|
flags.Var(&options.hosts, flagHostAdd, "Add a custom host-to-IP mapping (host:ip)")
|
||||||
flags.SetAnnotation(flagHostAdd, "version", []string{"1.25"})
|
flags.SetAnnotation(flagHostAdd, "version", []string{"1.25"})
|
||||||
|
flags.BoolVar(&options.init, flagInit, false, "Use an init inside each service container to forward signals and reap processes")
|
||||||
|
flags.SetAnnotation(flagInit, "version", []string{"1.37"})
|
||||||
|
|
||||||
// Add needs parsing, Remove only needs the key
|
// Add needs parsing, Remove only needs the key
|
||||||
flags.Var(newListOptsVar(), flagGenericResourcesRemove, "Remove a Generic resource")
|
flags.Var(newListOptsVar(), flagGenericResourcesRemove, "Remove a Generic resource")
|
||||||
|
@ -235,6 +237,12 @@ func runUpdate(dockerCli command.Cli, flags *pflag.FlagSet, options *serviceOpti
|
||||||
|
|
||||||
// nolint: gocyclo
|
// nolint: gocyclo
|
||||||
func updateService(ctx context.Context, apiClient client.NetworkAPIClient, flags *pflag.FlagSet, spec *swarm.ServiceSpec) error {
|
func updateService(ctx context.Context, apiClient client.NetworkAPIClient, flags *pflag.FlagSet, spec *swarm.ServiceSpec) error {
|
||||||
|
updateBoolPtr := func(flag string, field **bool) {
|
||||||
|
if flags.Changed(flag) {
|
||||||
|
b, _ := flags.GetBool(flag)
|
||||||
|
*field = &b
|
||||||
|
}
|
||||||
|
}
|
||||||
updateString := func(flag string, field *string) {
|
updateString := func(flag string, field *string) {
|
||||||
if flags.Changed(flag) {
|
if flags.Changed(flag) {
|
||||||
*field, _ = flags.GetString(flag)
|
*field, _ = flags.GetString(flag)
|
||||||
|
@ -306,6 +314,7 @@ func updateService(ctx context.Context, apiClient client.NetworkAPIClient, flags
|
||||||
updateString(flagWorkdir, &cspec.Dir)
|
updateString(flagWorkdir, &cspec.Dir)
|
||||||
updateString(flagUser, &cspec.User)
|
updateString(flagUser, &cspec.User)
|
||||||
updateString(flagHostname, &cspec.Hostname)
|
updateString(flagHostname, &cspec.Hostname)
|
||||||
|
updateBoolPtr(flagInit, &cspec.Init)
|
||||||
if err := updateIsolation(flagIsolation, &cspec.Isolation); err != nil {
|
if err := updateIsolation(flagIsolation, &cspec.Isolation); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
@ -547,6 +547,32 @@ func TestUpdateReadOnly(t *testing.T) {
|
||||||
assert.Check(t, !cspec.ReadOnly)
|
assert.Check(t, !cspec.ReadOnly)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestUpdateInit(t *testing.T) {
|
||||||
|
spec := &swarm.ServiceSpec{
|
||||||
|
TaskTemplate: swarm.TaskSpec{
|
||||||
|
ContainerSpec: &swarm.ContainerSpec{},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
cspec := spec.TaskTemplate.ContainerSpec
|
||||||
|
|
||||||
|
// Update with --init=true
|
||||||
|
flags := newUpdateCommand(nil).Flags()
|
||||||
|
flags.Set("init", "true")
|
||||||
|
updateService(nil, nil, flags, spec)
|
||||||
|
assert.Check(t, is.Equal(true, *cspec.Init))
|
||||||
|
|
||||||
|
// Update without --init, no change
|
||||||
|
flags = newUpdateCommand(nil).Flags()
|
||||||
|
updateService(nil, nil, flags, spec)
|
||||||
|
assert.Check(t, is.Equal(true, *cspec.Init))
|
||||||
|
|
||||||
|
// Update with --init=false
|
||||||
|
flags = newUpdateCommand(nil).Flags()
|
||||||
|
flags.Set("init", "false")
|
||||||
|
updateService(nil, nil, flags, spec)
|
||||||
|
assert.Check(t, is.Equal(false, *cspec.Init))
|
||||||
|
}
|
||||||
|
|
||||||
func TestUpdateStopSignal(t *testing.T) {
|
func TestUpdateStopSignal(t *testing.T) {
|
||||||
spec := &swarm.ServiceSpec{
|
spec := &swarm.ServiceSpec{
|
||||||
TaskTemplate: swarm.TaskSpec{
|
TaskTemplate: swarm.TaskSpec{
|
||||||
|
|
|
@ -43,6 +43,7 @@ Options:
|
||||||
--help Print usage
|
--help Print usage
|
||||||
--host list Set one or more custom host-to-IP mappings (host:ip)
|
--host list Set one or more custom host-to-IP mappings (host:ip)
|
||||||
--hostname string Container hostname
|
--hostname string Container hostname
|
||||||
|
--init bool Use an init inside each service container to forward signals and reap processes
|
||||||
--isolation string Service container isolation mode
|
--isolation string Service container isolation mode
|
||||||
-l, --label list Service labels
|
-l, --label list Service labels
|
||||||
--limit-cpu decimal Limit CPUs
|
--limit-cpu decimal Limit CPUs
|
||||||
|
|
|
@ -54,6 +54,7 @@ Options:
|
||||||
--host-add list Add a custom host-to-IP mapping (host:ip)
|
--host-add list Add a custom host-to-IP mapping (host:ip)
|
||||||
--host-rm list Remove a custom host-to-IP mapping (host:ip)
|
--host-rm list Remove a custom host-to-IP mapping (host:ip)
|
||||||
--hostname string Container hostname
|
--hostname string Container hostname
|
||||||
|
--init bool Use an init inside each service container to forward signals and reap processes
|
||||||
--image string Service image tag
|
--image string Service image tag
|
||||||
--isolation string Service container isolation mode
|
--isolation string Service container isolation mode
|
||||||
--label-add list Add or update a service label
|
--label-add list Add or update a service label
|
||||||
|
|
Loading…
Reference in New Issue