use yum repos for redhat like distros

Signed-off-by: Evan Hazlett <ejhazlett@gmail.com>
This commit is contained in:
Evan Hazlett 2015-07-16 20:38:22 -04:00
parent ad6d8d49a8
commit 01bf2ea2d7
3 changed files with 63 additions and 38 deletions

View File

@ -4,13 +4,6 @@ import (
"github.com/docker/machine/drivers" "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() { func init() {
Register("Centos", &RegisteredProvisioner{ Register("Centos", &RegisteredProvisioner{
New: NewCentosProvisioner, New: NewCentosProvisioner,
@ -28,7 +21,6 @@ func NewCentosProvisioner(d drivers.Driver) Provisioner {
p := &CentosProvisioner{ p := &CentosProvisioner{
RedHatProvisioner{ RedHatProvisioner{
GenericProvisioner: g, GenericProvisioner: g,
DockerRPMPath: dockerCentosRPMPath,
}, },
} }
return p return p

View File

@ -4,13 +4,6 @@ import (
"github.com/docker/machine/drivers" "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() { func init() {
Register("Fedora", &RegisteredProvisioner{ Register("Fedora", &RegisteredProvisioner{
New: NewFedoraProvisioner, New: NewFedoraProvisioner,
@ -28,7 +21,6 @@ func NewFedoraProvisioner(d drivers.Driver) Provisioner {
p := &FedoraProvisioner{ p := &FedoraProvisioner{
RedHatProvisioner{ RedHatProvisioner{
GenericProvisioner: g, GenericProvisioner: g,
DockerRPMPath: dockerFedoraRPMPath,
}, },
} }
return p return p

View File

@ -2,6 +2,7 @@ package provision
import ( import (
"bytes" "bytes"
"errors"
"fmt" "fmt"
"text/template" "text/template"
@ -15,13 +16,31 @@ import (
"github.com/docker/machine/utils" "github.com/docker/machine/utils"
) )
const ( var (
// TODO: eventually the RPM install process will be integrated ErrUnknownYumOsRelease = errors.New("unknown OS for Yum repository")
// into the get.docker.com install script; for now
// we install via vendored RPMs packageListTemplate = `[docker]
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" 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() { func init() {
Register("RedHat", &RegisteredProvisioner{ Register("RedHat", &RegisteredProvisioner{
New: NewRedHatProvisioner, New: NewRedHatProvisioner,
@ -39,13 +58,11 @@ func NewRedHatProvisioner(d drivers.Driver) Provisioner {
}, },
Driver: d, Driver: d,
}, },
DockerRPMPath: dockerRHELRPMPath,
} }
} }
type RedHatProvisioner struct { type RedHatProvisioner struct {
GenericProvisioner GenericProvisioner
DockerRPMPath string
} }
func (provisioner *RedHatProvisioner) SSHCommand(args string) (string, error) { func (provisioner *RedHatProvisioner) SSHCommand(args string) (string, error) {
@ -155,7 +172,11 @@ func installDocker(provisioner *RedHatProvisioner) error {
func (provisioner *RedHatProvisioner) installOfficialDocker() error { func (provisioner *RedHatProvisioner) installOfficialDocker() error {
log.Debug("installing docker") 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 return err
} }
@ -230,25 +251,12 @@ func (provisioner *RedHatProvisioner) GenerateDockerOptions(dockerPort int) (*Do
configPath = provisioner.DaemonOptionsFile 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()) driverNameLabel := fmt.Sprintf("provider=%s", provisioner.Driver.DriverName())
provisioner.EngineOptions.Labels = append(provisioner.EngineOptions.Labels, driverNameLabel) provisioner.EngineOptions.Labels = append(provisioner.EngineOptions.Labels, driverNameLabel)
// systemd / redhat will not load options if they are on newlines // systemd / redhat will not load options if they are on newlines
// instead, it just continues with a different set of options; yeah... // instead, it just continues with a different set of options; yeah...
engineConfigTmpl := `[Service] t, err := template.New("engineConfig").Parse(engineConfigTemplate)
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)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@ -268,3 +276,36 @@ Environment={{range .EngineOptions.Env}}{{ printf "%q" . }} {{end}}
EngineOptionsPath: daemonOptsDir, EngineOptionsPath: daemonOptsDir,
}, nil }, 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
}