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"
)
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

View File

@ -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

View File

@ -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
}