mirror of https://github.com/docker/docs.git
				
				
				
			
		
			
				
	
	
		
			97 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Go
		
	
	
	
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 (p *SystemdProvisioner) String() string {
 | 
						|
	return "redhat"
 | 
						|
}
 | 
						|
 | 
						|
func NewSystemdProvisioner(osReleaseID string, d drivers.Driver) SystemdProvisioner {
 | 
						|
	return SystemdProvisioner{
 | 
						|
		GenericProvisioner{
 | 
						|
			SSHCommander:      GenericSSHCommander{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
 | 
						|
}
 |