From b00e30c38feb8d31c0d3e94eea7013adf7501db8 Mon Sep 17 00:00:00 2001 From: David Gageot Date: Wed, 18 Nov 2015 17:34:10 +0100 Subject: [PATCH] Revert "Remove systemd-related driver duplication" This reverts commit fda08f5e15627facb3e2cfe8ff7b0a891ba2c876. Signed-off-by: David Gageot --- libmachine/provision/arch.go | 61 ++++++++++++- libmachine/provision/centos.go | 16 +++- libmachine/provision/coreos.go | 1 + libmachine/provision/debian.go | 67 +++++++++++++- libmachine/provision/fedora.go | 16 +++- libmachine/provision/generic.go | 13 +-- libmachine/provision/provisioner.go | 10 +-- libmachine/provision/redhat.go | 67 ++++++++++++-- libmachine/provision/redhat_ssh_commander.go | 31 ------- libmachine/provision/redhat_test.go | 2 +- libmachine/provision/systemd.go | 92 -------------------- libmachine/provision/ubuntu_systemd.go | 73 +++++++++++++++- 12 files changed, 289 insertions(+), 160 deletions(-) delete mode 100644 libmachine/provision/redhat_ssh_commander.go delete mode 100644 libmachine/provision/systemd.go diff --git a/libmachine/provision/arch.go b/libmachine/provision/arch.go index f9ed56dcf2..38f984d28a 100644 --- a/libmachine/provision/arch.go +++ b/libmachine/provision/arch.go @@ -1,7 +1,9 @@ package provision import ( + "bytes" "fmt" + "text/template" "github.com/docker/machine/libmachine/auth" "github.com/docker/machine/libmachine/drivers" @@ -21,18 +23,39 @@ func init() { func NewArchProvisioner(d drivers.Driver) Provisioner { return &ArchProvisioner{ - NewSystemdProvisioner("arch", d), + GenericProvisioner{ + DockerOptionsDir: "/etc/docker", + DaemonOptionsFile: "/etc/systemd/system/docker.service", + OsReleaseID: "arch", + Packages: []string{}, + Driver: d, + }, } } type ArchProvisioner struct { - SystemdProvisioner + GenericProvisioner } func (provisioner *ArchProvisioner) CompatibleWithHost() bool { return provisioner.OsReleaseInfo.ID == provisioner.OsReleaseID || provisioner.OsReleaseInfo.IDLike == provisioner.OsReleaseID } +func (provisioner *ArchProvisioner) Service(name string, action serviceaction.ServiceAction) error { + // daemon-reload to catch config updates; systemd -- ugh + if _, err := provisioner.SSHCommand("sudo systemctl daemon-reload"); err != nil { + return err + } + + command := fmt.Sprintf("sudo systemctl %s %s", action.String(), name) + + if _, err := provisioner.SSHCommand(command); err != nil { + return err + } + + return nil +} + func (provisioner *ArchProvisioner) Package(name string, action pkgaction.PackageAction) error { var packageAction string @@ -144,3 +167,37 @@ func (provisioner *ArchProvisioner) Provision(swarmOptions swarm.Options, authOp return nil } + +func (provisioner *ArchProvisioner) GenerateDockerOptions(dockerPort int) (*DockerOptions, error) { + var ( + engineCfg bytes.Buffer + ) + + driverNameLabel := fmt.Sprintf("provider=%s", provisioner.Driver.DriverName()) + provisioner.EngineOptions.Labels = append(provisioner.EngineOptions.Labels, driverNameLabel) + + engineConfigTmpl := `[Service] +ExecStart=/usr/bin/docker -d -H tcp://0.0.0.0:{{.DockerPort}} -H unix:///var/run/docker.sock --storage-driver {{.EngineOptions.StorageDriver}} --tlsverify --tlscacert {{.AuthOptions.CaCertRemotePath}} --tlscert {{.AuthOptions.ServerCertRemotePath}} --tlskey {{.AuthOptions.ServerKeyRemotePath}} {{ range .EngineOptions.Labels }}--label {{.}} {{ end }}{{ range .EngineOptions.InsecureRegistry }}--insecure-registry {{.}} {{ end }}{{ range .EngineOptions.RegistryMirror }}--registry-mirror {{.}} {{ end }}{{ range .EngineOptions.ArbitraryFlags }}--{{.}} {{ end }} +MountFlags=slave +LimitNOFILE=1048576 +LimitNPROC=1048576 +LimitCORE=infinity +` + t, err := template.New("engineConfig").Parse(engineConfigTmpl) + if err != nil { + return nil, err + } + + engineConfigContext := EngineConfigContext{ + DockerPort: dockerPort, + AuthOptions: provisioner.AuthOptions, + EngineOptions: provisioner.EngineOptions, + } + + t.Execute(&engineCfg, engineConfigContext) + + return &DockerOptions{ + EngineOptions: engineCfg.String(), + EngineOptionsPath: provisioner.DaemonOptionsFile, + }, nil +} diff --git a/libmachine/provision/centos.go b/libmachine/provision/centos.go index 7cadda47a8..a96439ae7f 100644 --- a/libmachine/provision/centos.go +++ b/libmachine/provision/centos.go @@ -11,11 +11,21 @@ func init() { } func NewCentosProvisioner(d drivers.Driver) Provisioner { - return &CentosProvisioner{ - NewRedHatProvisioner("centos", d), + g := GenericProvisioner{ + DockerOptionsDir: "/etc/docker", + DaemonOptionsFile: "/etc/systemd/system/docker.service", + OsReleaseID: "centos", + Packages: []string{}, + Driver: d, } + p := &CentosProvisioner{ + RedHatProvisioner{ + GenericProvisioner: g, + }, + } + return p } type CentosProvisioner struct { - *RedHatProvisioner + RedHatProvisioner } diff --git a/libmachine/provision/coreos.go b/libmachine/provision/coreos.go index 9afdcd8bf2..ea39fe8a5d 100644 --- a/libmachine/provision/coreos.go +++ b/libmachine/provision/coreos.go @@ -45,6 +45,7 @@ type CoreOSProvisioner struct { } func (provisioner *CoreOSProvisioner) Service(name string, action serviceaction.ServiceAction) error { + // daemon-reload to catch config updates; systemd -- ugh if _, err := provisioner.SSHCommand("sudo systemctl daemon-reload"); err != nil { return err } diff --git a/libmachine/provision/debian.go b/libmachine/provision/debian.go index b9babc4ec4..9214239fd6 100644 --- a/libmachine/provision/debian.go +++ b/libmachine/provision/debian.go @@ -1,7 +1,9 @@ package provision import ( + "bytes" "fmt" + "text/template" "github.com/docker/machine/libmachine/auth" "github.com/docker/machine/libmachine/drivers" @@ -21,12 +23,35 @@ func init() { func NewDebianProvisioner(d drivers.Driver) Provisioner { return &DebianProvisioner{ - NewSystemdProvisioner("debian", d), + GenericProvisioner{ + DockerOptionsDir: "/etc/docker", + DaemonOptionsFile: "/etc/systemd/system/docker.service", + OsReleaseID: "debian", + Packages: []string{ + "curl", + }, + Driver: d, + }, } } type DebianProvisioner struct { - SystemdProvisioner + GenericProvisioner +} + +func (provisioner *DebianProvisioner) Service(name string, action serviceaction.ServiceAction) error { + // daemon-reload to catch config updates; systemd -- ugh + if _, err := provisioner.SSHCommand("sudo systemctl daemon-reload"); err != nil { + return err + } + + command := fmt.Sprintf("sudo systemctl -f %s %s", action.String(), name) + + if _, err := provisioner.SSHCommand(command); err != nil { + return err + } + + return nil } func (provisioner *DebianProvisioner) Package(name string, action pkgaction.PackageAction) error { @@ -154,3 +179,41 @@ func (provisioner *DebianProvisioner) Provision(swarmOptions swarm.Options, auth return nil } + +func (provisioner *DebianProvisioner) GenerateDockerOptions(dockerPort int) (*DockerOptions, error) { + var ( + engineCfg bytes.Buffer + ) + + driverNameLabel := fmt.Sprintf("provider=%s", provisioner.Driver.DriverName()) + provisioner.EngineOptions.Labels = append(provisioner.EngineOptions.Labels, driverNameLabel) + + engineConfigTmpl := `[Service] +ExecStart=/usr/bin/docker -d -H tcp://0.0.0.0:{{.DockerPort}} -H unix:///var/run/docker.sock --storage-driver {{.EngineOptions.StorageDriver}} --tlsverify --tlscacert {{.AuthOptions.CaCertRemotePath}} --tlscert {{.AuthOptions.ServerCertRemotePath}} --tlskey {{.AuthOptions.ServerKeyRemotePath}} {{ range .EngineOptions.Labels }}--label {{.}} {{ end }}{{ range .EngineOptions.InsecureRegistry }}--insecure-registry {{.}} {{ end }}{{ range .EngineOptions.RegistryMirror }}--registry-mirror {{.}} {{ end }}{{ range .EngineOptions.ArbitraryFlags }}--{{.}} {{ end }} +MountFlags=slave +LimitNOFILE=1048576 +LimitNPROC=1048576 +LimitCORE=infinity +Environment={{range .EngineOptions.Env}}{{ printf "%q" . }} {{end}} + +[Install] +WantedBy=multi-user.target +` + t, err := template.New("engineConfig").Parse(engineConfigTmpl) + if err != nil { + return nil, err + } + + engineConfigContext := EngineConfigContext{ + DockerPort: dockerPort, + AuthOptions: provisioner.AuthOptions, + EngineOptions: provisioner.EngineOptions, + } + + t.Execute(&engineCfg, engineConfigContext) + + return &DockerOptions{ + EngineOptions: engineCfg.String(), + EngineOptionsPath: provisioner.DaemonOptionsFile, + }, nil +} diff --git a/libmachine/provision/fedora.go b/libmachine/provision/fedora.go index ebfd91870d..546dec0b5c 100644 --- a/libmachine/provision/fedora.go +++ b/libmachine/provision/fedora.go @@ -11,11 +11,21 @@ func init() { } func NewFedoraProvisioner(d drivers.Driver) Provisioner { - return &FedoraProvisioner{ - NewRedHatProvisioner("fedora", d), + g := GenericProvisioner{ + DockerOptionsDir: "/etc/docker", + DaemonOptionsFile: "/etc/systemd/system/docker.service", + OsReleaseID: "fedora", + Packages: []string{}, + Driver: d, } + p := &FedoraProvisioner{ + RedHatProvisioner{ + GenericProvisioner: g, + }, + } + return p } type FedoraProvisioner struct { - *RedHatProvisioner + RedHatProvisioner } diff --git a/libmachine/provision/generic.go b/libmachine/provision/generic.go index bc126f6243..db6238c492 100644 --- a/libmachine/provision/generic.go +++ b/libmachine/provision/generic.go @@ -12,7 +12,6 @@ import ( ) type GenericProvisioner struct { - SSHCommander OsReleaseID string DockerOptionsDir string DaemonOptionsFile string @@ -24,14 +23,6 @@ type GenericProvisioner struct { SwarmOptions swarm.Options } -type GenericSSHCmder struct { - Driver drivers.Driver -} - -func (sshCmder GenericSSHCmder) SSHCommand(args string) (string, error) { - return drivers.RunSSHCommandFromDriver(sshCmder.Driver, args) -} - func (provisioner *GenericProvisioner) Hostname() (string, error) { return provisioner.SSHCommand("hostname") } @@ -61,6 +52,10 @@ func (provisioner *GenericProvisioner) GetDockerOptionsDir() string { return provisioner.DockerOptionsDir } +func (provisioner *GenericProvisioner) SSHCommand(args string) (string, error) { + return drivers.RunSSHCommandFromDriver(provisioner.Driver, args) +} + func (provisioner *GenericProvisioner) CompatibleWithHost() bool { return provisioner.OsReleaseInfo.ID == provisioner.OsReleaseID } diff --git a/libmachine/provision/provisioner.go b/libmachine/provision/provisioner.go index c91d78e078..c5d2c5a1d5 100644 --- a/libmachine/provision/provisioner.go +++ b/libmachine/provision/provisioner.go @@ -14,15 +14,8 @@ import ( var provisioners = make(map[string]*RegisteredProvisioner) -type SSHCommander interface { - // Short-hand for accessing an SSH command from the driver. - SSHCommand(args string) (string, error) -} - // Provisioner defines distribution specific actions type Provisioner interface { - SSHCommander - // Create the files for the daemon to consume configuration settings (return struct of content and path) GenerateDockerOptions(dockerPort int) (*DockerOptions, error) @@ -58,6 +51,9 @@ type Provisioner interface { // Get the driver which is contained in the provisioner. GetDriver() drivers.Driver + // Short-hand for accessing an SSH command from the driver. + SSHCommand(args string) (string, error) + // Set the OS Release info depending on how it's represented // internally SetOsReleaseInfo(info *OsRelease) diff --git a/libmachine/provision/redhat.go b/libmachine/provision/redhat.go index a5118db271..85dccbb167 100644 --- a/libmachine/provision/redhat.go +++ b/libmachine/provision/redhat.go @@ -13,6 +13,7 @@ import ( "github.com/docker/machine/libmachine/mcnutils" "github.com/docker/machine/libmachine/provision/pkgaction" "github.com/docker/machine/libmachine/provision/serviceaction" + "github.com/docker/machine/libmachine/ssh" "github.com/docker/machine/libmachine/swarm" ) @@ -43,22 +44,47 @@ type PackageListInfo struct { func init() { Register("RedHat", &RegisteredProvisioner{ - New: func(d drivers.Driver) Provisioner { - return NewRedHatProvisioner("rhel", d) - }, + New: NewRedHatProvisioner, }) } -func NewRedHatProvisioner(osReleaseID string, d drivers.Driver) *RedHatProvisioner { - systemdProvisioner := NewSystemdProvisioner(osReleaseID, d) - systemdProvisioner.SSHCommander = RedHatSSHCommander{Driver: d} +func NewRedHatProvisioner(d drivers.Driver) Provisioner { return &RedHatProvisioner{ - systemdProvisioner, + GenericProvisioner: GenericProvisioner{ + DockerOptionsDir: "/etc/docker", + DaemonOptionsFile: "/etc/systemd/system/docker.service", + OsReleaseID: "rhel", + Packages: []string{ + "curl", + }, + Driver: d, + }, } } type RedHatProvisioner struct { - SystemdProvisioner + GenericProvisioner +} + +func (provisioner *RedHatProvisioner) SSHCommand(args string) (string, error) { + client, err := drivers.GetSSHClientFromDriver(provisioner.Driver) + if err != nil { + return "", err + } + + // redhat needs "-t" for tty allocation on ssh therefore we check for the + // external client and add as needed. + // Note: CentOS 7.0 needs multiple "-tt" to force tty allocation when ssh has + // no local tty. + switch c := client.(type) { + case ssh.ExternalClient: + c.BaseArgs = append(c.BaseArgs, "-tt") + client = c + case ssh.NativeClient: + return c.OutputWithPty(args) + } + + return client.Output(args) } func (provisioner *RedHatProvisioner) SetHostname(hostname string) error { @@ -84,6 +110,31 @@ func (provisioner *RedHatProvisioner) SetHostname(hostname string) error { return nil } +func (provisioner *RedHatProvisioner) Service(name string, action serviceaction.ServiceAction) error { + reloadDaemon := false + switch action { + case serviceaction.Start, serviceaction.Restart: + reloadDaemon = true + } + + // systemd needs reloaded when config changes on disk; we cannot + // be sure exactly when it changes from the provisioner so + // we call a reload on every restart to be safe + if reloadDaemon { + if _, err := provisioner.SSHCommand("sudo systemctl daemon-reload"); err != nil { + return err + } + } + + command := fmt.Sprintf("sudo systemctl %s %s", action.String(), name) + + if _, err := provisioner.SSHCommand(command); err != nil { + return err + } + + return nil +} + func (provisioner *RedHatProvisioner) Package(name string, action pkgaction.PackageAction) error { var packageAction string diff --git a/libmachine/provision/redhat_ssh_commander.go b/libmachine/provision/redhat_ssh_commander.go deleted file mode 100644 index 5f9bf9f508..0000000000 --- a/libmachine/provision/redhat_ssh_commander.go +++ /dev/null @@ -1,31 +0,0 @@ -package provision - -import ( - "github.com/docker/machine/libmachine/drivers" - "github.com/docker/machine/libmachine/ssh" -) - -type RedHatSSHCommander struct { - Driver drivers.Driver -} - -func (sshCmder RedHatSSHCommander) SSHCommand(args string) (string, error) { - client, err := drivers.GetSSHClientFromDriver(sshCmder.Driver) - if err != nil { - return "", err - } - - // redhat needs "-t" for tty allocation on ssh therefore we check for the - // external client and add as needed. - // Note: CentOS 7.0 needs multiple "-tt" to force tty allocation when ssh has - // no local tty. - switch c := client.(type) { - case ssh.ExternalClient: - c.BaseArgs = append(c.BaseArgs, "-tt") - client = c - case ssh.NativeClient: - return c.OutputWithPty(args) - } - - return client.Output(args) -} diff --git a/libmachine/provision/redhat_test.go b/libmachine/provision/redhat_test.go index 551e951bdc..20050e8158 100644 --- a/libmachine/provision/redhat_test.go +++ b/libmachine/provision/redhat_test.go @@ -9,7 +9,7 @@ func TestRedHatGenerateYumRepoList(t *testing.T) { info := &OsRelease{ ID: "rhel", } - p := NewRedHatProvisioner("rhel", nil) + p := NewRedHatProvisioner(nil) p.SetOsReleaseInfo(info) buf, err := generateYumRepoList(p) diff --git a/libmachine/provision/systemd.go b/libmachine/provision/systemd.go deleted file mode 100644 index a70c042524..0000000000 --- a/libmachine/provision/systemd.go +++ /dev/null @@ -1,92 +0,0 @@ -package provision - -import ( - "bytes" - "fmt" - "text/template" - - "github.com/docker/machine/libmachine/drivers" - "github.com/docker/machine/libmachine/provision/serviceaction" -) - -type SystemdProvisioner struct { - GenericProvisioner -} - -func NewSystemdProvisioner(osReleaseID string, d drivers.Driver) SystemdProvisioner { - return SystemdProvisioner{ - GenericProvisioner{ - SSHCommander: GenericSSHCmder{Driver: d}, - DockerOptionsDir: "/etc/docker", - DaemonOptionsFile: "/etc/systemd/system/docker.service", - OsReleaseID: osReleaseID, - Packages: []string{ - "curl", - }, - Driver: d, - }, - } -} - -func (p *SystemdProvisioner) GenerateDockerOptions(dockerPort int) (*DockerOptions, error) { - var ( - engineCfg bytes.Buffer - ) - - driverNameLabel := fmt.Sprintf("provider=%s", p.Driver.DriverName()) - p.EngineOptions.Labels = append(p.EngineOptions.Labels, driverNameLabel) - - engineConfigTmpl := `[Service] -ExecStart=/usr/bin/docker -d -H tcp://0.0.0.0:{{.DockerPort}} -H unix:///var/run/docker.sock --storage-driver {{.EngineOptions.StorageDriver}} --tlsverify --tlscacert {{.AuthOptions.CaCertRemotePath}} --tlscert {{.AuthOptions.ServerCertRemotePath}} --tlskey {{.AuthOptions.ServerKeyRemotePath}} {{ range .EngineOptions.Labels }}--label {{.}} {{ end }}{{ range .EngineOptions.InsecureRegistry }}--insecure-registry {{.}} {{ end }}{{ range .EngineOptions.RegistryMirror }}--registry-mirror {{.}} {{ end }}{{ range .EngineOptions.ArbitraryFlags }}--{{.}} {{ end }} -MountFlags=slave -LimitNOFILE=1048576 -LimitNPROC=1048576 -LimitCORE=infinity -Environment={{range .EngineOptions.Env}}{{ printf "%q" . }} {{end}} - -[Install] -WantedBy=multi-user.target -` - t, err := template.New("engineConfig").Parse(engineConfigTmpl) - if err != nil { - return nil, err - } - - engineConfigContext := EngineConfigContext{ - DockerPort: dockerPort, - AuthOptions: p.AuthOptions, - EngineOptions: p.EngineOptions, - } - - t.Execute(&engineCfg, engineConfigContext) - - return &DockerOptions{ - EngineOptions: engineCfg.String(), - EngineOptionsPath: p.DaemonOptionsFile, - }, nil -} - -func (p *SystemdProvisioner) Service(name string, action serviceaction.ServiceAction) error { - reloadDaemon := false - switch action { - case serviceaction.Start, serviceaction.Restart: - reloadDaemon = true - } - - // systemd needs reloaded when config changes on disk; we cannot - // be sure exactly when it changes from the provisioner so - // we call a reload on every restart to be safe - if reloadDaemon { - if _, err := p.SSHCommand("sudo systemctl daemon-reload"); err != nil { - return err - } - } - - command := fmt.Sprintf("sudo systemctl -f %s %s", action.String(), name) - - if _, err := p.SSHCommand(command); err != nil { - return err - } - - return nil -} diff --git a/libmachine/provision/ubuntu_systemd.go b/libmachine/provision/ubuntu_systemd.go index 99a9dd82a5..9e87f2258f 100644 --- a/libmachine/provision/ubuntu_systemd.go +++ b/libmachine/provision/ubuntu_systemd.go @@ -1,8 +1,10 @@ package provision import ( + "bytes" "fmt" "strconv" + "text/template" "github.com/docker/machine/libmachine/auth" "github.com/docker/machine/libmachine/drivers" @@ -22,12 +24,20 @@ func init() { func NewUbuntuSystemdProvisioner(d drivers.Driver) Provisioner { return &UbuntuSystemdProvisioner{ - NewSystemdProvisioner("ubuntu", d), + GenericProvisioner{ + DockerOptionsDir: "/etc/docker", + DaemonOptionsFile: "/etc/systemd/system/docker.service", + OsReleaseID: "ubuntu", + Packages: []string{ + "curl", + }, + Driver: d, + }, } } type UbuntuSystemdProvisioner struct { - SystemdProvisioner + GenericProvisioner } func (provisioner *UbuntuSystemdProvisioner) CompatibleWithHost() bool { @@ -45,6 +55,21 @@ func (provisioner *UbuntuSystemdProvisioner) CompatibleWithHost() bool { } +func (provisioner *UbuntuSystemdProvisioner) Service(name string, action serviceaction.ServiceAction) error { + // daemon-reload to catch config updates; systemd -- ugh + if _, err := provisioner.SSHCommand("sudo systemctl daemon-reload"); err != nil { + return err + } + + command := fmt.Sprintf("sudo systemctl -f %s %s", action.String(), name) + + if _, err := provisioner.SSHCommand(command); err != nil { + return err + } + + return nil +} + func (provisioner *UbuntuSystemdProvisioner) Package(name string, action pkgaction.PackageAction) error { var packageAction string @@ -122,6 +147,12 @@ func (provisioner *UbuntuSystemdProvisioner) Provision(swarmOptions swarm.Option provisioner.EngineOptions.StorageDriver = "aufs" } + // HACK: since debian does not come with sudo by default we install + log.Debug("installing sudo") + if _, err := provisioner.SSHCommand("if ! type sudo; then apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y sudo; fi"); err != nil { + return err + } + log.Debug("setting hostname") if err := provisioner.SetHostname(provisioner.Driver.GetMachineName()); err != nil { return err @@ -164,3 +195,41 @@ func (provisioner *UbuntuSystemdProvisioner) Provision(swarmOptions swarm.Option return nil } + +func (provisioner *UbuntuSystemdProvisioner) GenerateDockerOptions(dockerPort int) (*DockerOptions, error) { + var ( + engineCfg bytes.Buffer + ) + + driverNameLabel := fmt.Sprintf("provider=%s", provisioner.Driver.DriverName()) + provisioner.EngineOptions.Labels = append(provisioner.EngineOptions.Labels, driverNameLabel) + + engineConfigTmpl := `[Service] +ExecStart=/usr/bin/docker -d -H tcp://0.0.0.0:{{.DockerPort}} -H unix:///var/run/docker.sock --storage-driver {{.EngineOptions.StorageDriver}} --tlsverify --tlscacert {{.AuthOptions.CaCertRemotePath}} --tlscert {{.AuthOptions.ServerCertRemotePath}} --tlskey {{.AuthOptions.ServerKeyRemotePath}} {{ range .EngineOptions.Labels }}--label {{.}} {{ end }}{{ range .EngineOptions.InsecureRegistry }}--insecure-registry {{.}} {{ end }}{{ range .EngineOptions.RegistryMirror }}--registry-mirror {{.}} {{ end }}{{ range .EngineOptions.ArbitraryFlags }}--{{.}} {{ end }} +MountFlags=slave +LimitNOFILE=1048576 +LimitNPROC=1048576 +LimitCORE=infinity +Environment={{range .EngineOptions.Env}}{{ printf "%q" . }} {{end}} + +[Install] +WantedBy=multi-user.target +` + t, err := template.New("engineConfig").Parse(engineConfigTmpl) + if err != nil { + return nil, err + } + + engineConfigContext := EngineConfigContext{ + DockerPort: dockerPort, + AuthOptions: provisioner.AuthOptions, + EngineOptions: provisioner.EngineOptions, + } + + t.Execute(&engineCfg, engineConfigContext) + + return &DockerOptions{ + EngineOptions: engineCfg.String(), + EngineOptionsPath: provisioner.DaemonOptionsFile, + }, nil +}