@@ -2,6 +2,7 @@ package provision
22
33import (
44 "bytes"
5+ "errors"
56 "fmt"
67 "text/template"
78
@@ -15,13 +16,31 @@ import (
1516 "github.com/docker/machine/utils"
1617)
1718
18- const (
19- // TODO: eventually the RPM install process will be integrated
20- // into the get.docker.com install script; for now
21- // we install via vendored RPMs
22- 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"
19+ var (
20+ ErrUnknownYumOsRelease = errors .New ("unknown OS for Yum repository" )
21+
22+ packageListTemplate = `[docker]
23+ name=Docker Stable Repository
24+ baseurl=https://yum.dockerproject.org/repo/main/{{.OsRelease}}/{{.OsReleaseVersion}}
25+ priority=1
26+ enabled=1
27+ gpgkey=https://yum.dockerproject.org/gpg
28+ `
29+ engineConfigTemplate = `[Service]
30+ 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 }}
31+ MountFlags=slave
32+ LimitNOFILE=1048576
33+ LimitNPROC=1048576
34+ LimitCORE=infinity
35+ Environment={{range .EngineOptions.Env}}{{ printf "%q" . }} {{end}}
36+ `
2337)
2438
39+ type PackageListInfo struct {
40+ OsRelease string
41+ OsReleaseVersion string
42+ }
43+
2544func init () {
2645 Register ("RedHat" , & RegisteredProvisioner {
2746 New : NewRedHatProvisioner ,
@@ -39,13 +58,11 @@ func NewRedHatProvisioner(d drivers.Driver) Provisioner {
3958 },
4059 Driver : d ,
4160 },
42- DockerRPMPath : dockerRHELRPMPath ,
4361 }
4462}
4563
4664type RedHatProvisioner struct {
4765 GenericProvisioner
48- DockerRPMPath string
4966}
5067
5168func (provisioner * RedHatProvisioner ) SSHCommand (args string ) (string , error ) {
@@ -155,7 +172,11 @@ func installDocker(provisioner *RedHatProvisioner) error {
155172func (provisioner * RedHatProvisioner ) installOfficialDocker () error {
156173 log .Debug ("installing docker" )
157174
158- if _ , err := provisioner .SSHCommand (fmt .Sprintf ("sudo yum install -y --nogpgcheck %s" , provisioner .DockerRPMPath )); err != nil {
175+ if err := provisioner .ConfigurePackageList (); err != nil {
176+ return err
177+ }
178+
179+ if _ , err := provisioner .SSHCommand ("sudo yum install -y docker-engine" ); err != nil {
159180 return err
160181 }
161182
@@ -230,25 +251,12 @@ func (provisioner *RedHatProvisioner) GenerateDockerOptions(dockerPort int) (*Do
230251 configPath = provisioner .DaemonOptionsFile
231252 )
232253
233- // remove existing
234- //if _, err := provisioner.SSHCommand(fmt.Sprintf("sudo rm %s", configPath)); err != nil {
235- // return nil, err
236- //}
237-
238254 driverNameLabel := fmt .Sprintf ("provider=%s" , provisioner .Driver .DriverName ())
239255 provisioner .EngineOptions .Labels = append (provisioner .EngineOptions .Labels , driverNameLabel )
240256
241257 // systemd / redhat will not load options if they are on newlines
242258 // instead, it just continues with a different set of options; yeah...
243- engineConfigTmpl := `[Service]
244- 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 }}
245- MountFlags=slave
246- LimitNOFILE=1048576
247- LimitNPROC=1048576
248- LimitCORE=infinity
249- Environment={{range .EngineOptions.Env}}{{ printf "%q" . }} {{end}}
250- `
251- t , err := template .New ("engineConfig" ).Parse (engineConfigTmpl )
259+ t , err := template .New ("engineConfig" ).Parse (engineConfigTemplate )
252260 if err != nil {
253261 return nil , err
254262 }
@@ -268,3 +276,36 @@ Environment={{range .EngineOptions.Env}}{{ printf "%q" . }} {{end}}
268276 EngineOptionsPath : daemonOptsDir ,
269277 }, nil
270278}
279+
280+ func (provisioner * RedHatProvisioner ) ConfigurePackageList () error {
281+ packageListInfo := & PackageListInfo {}
282+ switch provisioner .OsReleaseId {
283+ case "rhel" , "centos" :
284+ // rhel and centos both use the "centos" repo
285+ packageListInfo .OsRelease = "centos"
286+ packageListInfo .OsReleaseVersion = "7"
287+ case "fedora" :
288+ packageListInfo .OsRelease = "fedora"
289+ packageListInfo .OsReleaseVersion = "22"
290+ default :
291+ return ErrUnknownYumOsRelease
292+ }
293+
294+ t , err := template .New ("packageList" ).Parse (packageListTemplate )
295+ if err != nil {
296+ return err
297+ }
298+
299+ var buf bytes.Buffer
300+
301+ if err := t .Execute (& buf , packageListInfo ); err != nil {
302+ return err
303+ }
304+
305+ packageCmd := fmt .Sprintf ("echo \" %s\" | sudo tee /etc/yum.repos.d/docker.repo" , buf .String ())
306+ if _ , err := provisioner .SSHCommand (packageCmd ); err != nil {
307+ return err
308+ }
309+
310+ return nil
311+ }
0 commit comments