From 01bf2ea2d75249a8e7ae5280963e7b348aa1663c Mon Sep 17 00:00:00 2001 From: Evan Hazlett Date: Thu, 16 Jul 2015 20:38:22 -0400 Subject: [PATCH] use yum repos for redhat like distros Signed-off-by: Evan Hazlett --- libmachine/provision/centos.go | 8 ---- libmachine/provision/fedora.go | 8 ---- libmachine/provision/redhat.go | 85 +++++++++++++++++++++++++--------- 3 files changed, 63 insertions(+), 38 deletions(-) diff --git a/libmachine/provision/centos.go b/libmachine/provision/centos.go index 8226cd1ab9..b348e005e0 100644 --- a/libmachine/provision/centos.go +++ b/libmachine/provision/centos.go @@ -4,13 +4,6 @@ import ( "github.com/docker/machine/drivers" ) -const ( - // TODO: eventually the RPM install process will be integrated - // into the get.docker.com install script; for now - // we install via vendored RPMs - dockerCentosRPMPath = "https://get.docker.com/rpm/1.7.0/centos-7/RPMS/x86_64/docker-engine-1.7.0-1.el7.centos.x86_64.rpm" -) - func init() { Register("Centos", &RegisteredProvisioner{ New: NewCentosProvisioner, @@ -28,7 +21,6 @@ func NewCentosProvisioner(d drivers.Driver) Provisioner { p := &CentosProvisioner{ RedHatProvisioner{ GenericProvisioner: g, - DockerRPMPath: dockerCentosRPMPath, }, } return p diff --git a/libmachine/provision/fedora.go b/libmachine/provision/fedora.go index 1b71cb6232..a201fe7a9d 100644 --- a/libmachine/provision/fedora.go +++ b/libmachine/provision/fedora.go @@ -4,13 +4,6 @@ import ( "github.com/docker/machine/drivers" ) -const ( - // TODO: eventually the RPM install process will be integrated - // into the get.docker.com install script; for now - // we install via vendored RPMs - dockerFedoraRPMPath = "https://get.docker.com/rpm/1.7.0/fedora-21/RPMS/x86_64/docker-engine-1.7.0-1.fc21.x86_64.rpm" -) - func init() { Register("Fedora", &RegisteredProvisioner{ New: NewFedoraProvisioner, @@ -28,7 +21,6 @@ func NewFedoraProvisioner(d drivers.Driver) Provisioner { p := &FedoraProvisioner{ RedHatProvisioner{ GenericProvisioner: g, - DockerRPMPath: dockerFedoraRPMPath, }, } return p diff --git a/libmachine/provision/redhat.go b/libmachine/provision/redhat.go index 271e5d5ee1..d6b8afcf95 100644 --- a/libmachine/provision/redhat.go +++ b/libmachine/provision/redhat.go @@ -2,6 +2,7 @@ package provision import ( "bytes" + "errors" "fmt" "text/template" @@ -15,13 +16,31 @@ import ( "github.com/docker/machine/utils" ) -const ( - // TODO: eventually the RPM install process will be integrated - // into the get.docker.com install script; for now - // we install via vendored RPMs - dockerRHELRPMPath = "https://get.docker.com/rpm/1.7.0/centos-7/RPMS/x86_64/docker-engine-1.7.0-1.el7.centos.x86_64.rpm" +var ( + ErrUnknownYumOsRelease = errors.New("unknown OS for Yum repository") + + packageListTemplate = `[docker] +name=Docker Stable Repository +baseurl=https://yum.dockerproject.org/repo/main/{{.OsRelease}}/{{.OsReleaseVersion}} +priority=1 +enabled=1 +gpgkey=https://yum.dockerproject.org/gpg +` + engineConfigTemplate = `[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}} +` ) +type PackageListInfo struct { + OsRelease string + OsReleaseVersion string +} + func init() { Register("RedHat", &RegisteredProvisioner{ New: NewRedHatProvisioner, @@ -39,13 +58,11 @@ func NewRedHatProvisioner(d drivers.Driver) Provisioner { }, Driver: d, }, - DockerRPMPath: dockerRHELRPMPath, } } type RedHatProvisioner struct { GenericProvisioner - DockerRPMPath string } func (provisioner *RedHatProvisioner) SSHCommand(args string) (string, error) { @@ -155,7 +172,11 @@ func installDocker(provisioner *RedHatProvisioner) error { func (provisioner *RedHatProvisioner) installOfficialDocker() error { log.Debug("installing docker") - if _, err := provisioner.SSHCommand(fmt.Sprintf("sudo yum install -y --nogpgcheck %s", provisioner.DockerRPMPath)); err != nil { + if err := provisioner.ConfigurePackageList(); err != nil { + return err + } + + if _, err := provisioner.SSHCommand("sudo yum install -y docker-engine"); err != nil { return err } @@ -230,25 +251,12 @@ func (provisioner *RedHatProvisioner) GenerateDockerOptions(dockerPort int) (*Do configPath = provisioner.DaemonOptionsFile ) - // remove existing - //if _, err := provisioner.SSHCommand(fmt.Sprintf("sudo rm %s", configPath)); err != nil { - // return nil, err - //} - driverNameLabel := fmt.Sprintf("provider=%s", provisioner.Driver.DriverName()) provisioner.EngineOptions.Labels = append(provisioner.EngineOptions.Labels, driverNameLabel) // systemd / redhat will not load options if they are on newlines // instead, it just continues with a different set of options; yeah... - 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}} -` - t, err := template.New("engineConfig").Parse(engineConfigTmpl) + t, err := template.New("engineConfig").Parse(engineConfigTemplate) if err != nil { return nil, err } @@ -268,3 +276,36 @@ Environment={{range .EngineOptions.Env}}{{ printf "%q" . }} {{end}} EngineOptionsPath: daemonOptsDir, }, nil } + +func (provisioner *RedHatProvisioner) ConfigurePackageList() error { + packageListInfo := &PackageListInfo{} + switch provisioner.OsReleaseId { + case "rhel", "centos": + // rhel and centos both use the "centos" repo + packageListInfo.OsRelease = "centos" + packageListInfo.OsReleaseVersion = "7" + case "fedora": + packageListInfo.OsRelease = "fedora" + packageListInfo.OsReleaseVersion = "22" + default: + return ErrUnknownYumOsRelease + } + + t, err := template.New("packageList").Parse(packageListTemplate) + if err != nil { + return err + } + + var buf bytes.Buffer + + if err := t.Execute(&buf, packageListInfo); err != nil { + return err + } + + packageCmd := fmt.Sprintf("echo \"%s\" | sudo tee /etc/yum.repos.d/docker.repo", buf.String()) + if _, err := provisioner.SSHCommand(packageCmd); err != nil { + return err + } + + return nil +}