X Tutup
Skip to content

Commit 39e78df

Browse files
Merge pull request docker-archive-public#4002 from nathanleclaire/migrate_pkg_upgrade
Add support for upgrade to new CE edition
2 parents 405771c + d3ee30b commit 39e78df

File tree

7 files changed

+71
-11
lines changed

7 files changed

+71
-11
lines changed

libmachine/host/host.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"github.com/docker/machine/libmachine/drivers"
88
"github.com/docker/machine/libmachine/engine"
99
"github.com/docker/machine/libmachine/log"
10+
"github.com/docker/machine/libmachine/mcndockerclient"
1011
"github.com/docker/machine/libmachine/mcnerror"
1112
"github.com/docker/machine/libmachine/mcnutils"
1213
"github.com/docker/machine/libmachine/provision"
@@ -15,6 +16,7 @@ import (
1516
"github.com/docker/machine/libmachine/ssh"
1617
"github.com/docker/machine/libmachine/state"
1718
"github.com/docker/machine/libmachine/swarm"
19+
"github.com/docker/machine/libmachine/versioncmp"
1820
)
1921

2022
var (
@@ -162,6 +164,24 @@ func (h *Host) Restart() error {
162164
return h.WaitForDocker()
163165
}
164166

167+
func (h *Host) DockerVersion() (string, error) {
168+
url, err := h.Driver.GetURL()
169+
if err != nil {
170+
return "", err
171+
}
172+
173+
dockerHost := &mcndockerclient.RemoteDocker{
174+
HostURL: url,
175+
AuthOption: h.AuthOptions(),
176+
}
177+
dockerVersion, err := mcndockerclient.DockerVersion(dockerHost)
178+
if err != nil {
179+
return "", err
180+
}
181+
182+
return dockerVersion, nil
183+
}
184+
165185
func (h *Host) Upgrade() error {
166186
machineState, err := h.Driver.GetState()
167187
if err != nil {
@@ -180,6 +200,39 @@ func (h *Host) Upgrade() error {
180200
return err
181201
}
182202

203+
dockerVersion, err := h.DockerVersion()
204+
if err != nil {
205+
return err
206+
}
207+
208+
// If we're upgrading from a pre-CE (e.g., 1.13.1) release to a CE
209+
// release (e.g., 17.03.0-ce), we should simply uninstall and
210+
// re-install from scratch, since the official package names will
211+
// change from 'docker-engine' to 'docker-ce'.
212+
if versioncmp.LessThanOrEqualTo(dockerVersion, provision.LastReleaseBeforeCEVersioning) &&
213+
// RancherOS and boot2docker, being 'static ISO builds', have
214+
// an upgrade process which simply grabs the latest if it's
215+
// different, and so do not need to jump through this hoop to
216+
// upgrade safely.
217+
provisioner.String() != "rancheros" &&
218+
provisioner.String() != "boot2docker" {
219+
220+
// Name of pacakge 'docker-engine' will fall through in this
221+
// case, so that we execute, e.g.,
222+
//
223+
// 'sudo apt-get purge -y docker-engine'
224+
if err := provisioner.Package("docker-engine", pkgaction.Purge); err != nil {
225+
return err
226+
}
227+
228+
// Then we kick off the normal provisioning process which will
229+
// go off and install Docker (get.docker.com script should work
230+
// fine to install Docker from scratch after removing the old
231+
// packages, and images/containers etc. should be preserved in
232+
// /var/lib/docker)
233+
return h.Provision()
234+
}
235+
183236
log.Info("Upgrading docker...")
184237
if err := provisioner.Package("docker", pkgaction.Upgrade); err != nil {
185238
return err

libmachine/provision/arch.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ func (provisioner *ArchProvisioner) Package(name string, action pkgaction.Packag
5151
}
5252

5353
switch name {
54+
case "docker-engine":
55+
name = "docker"
5456
case "docker":
5557
name = "docker"
5658
}

libmachine/provision/debian.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ func (provisioner *DebianProvisioner) Package(name string, action pkgaction.Pack
4444
case pkgaction.Remove:
4545
packageAction = "remove"
4646
updateMetadata = false
47+
case pkgaction.Purge:
48+
packageAction = "purge"
49+
updateMetadata = false
4750
}
4851

4952
switch name {

libmachine/provision/pkgaction/pkg_action.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,14 @@ const (
66
Install PackageAction = iota
77
Remove
88
Upgrade
9+
Purge
910
)
1011

1112
var packageActions = []string{
1213
"install",
1314
"remove",
1415
"upgrade",
16+
"purge",
1517
}
1618

1719
func (s PackageAction) String() string {

libmachine/provision/provisioner.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ var (
1717
detector Detector = &StandardDetector{}
1818
)
1919

20+
const (
21+
LastReleaseBeforeCEVersioning = "1.13.1"
22+
)
23+
2024
type SSHCommander interface {
2125
// Short-hand for accessing an SSH command from the driver.
2226
SSHCommand(args string) (string, error)

libmachine/provision/redhat.go

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,11 @@ import (
1919

2020
var (
2121
ErrUnknownYumOsRelease = errors.New("unknown OS for Yum repository")
22-
23-
packageListTemplate = `[docker]
24-
name=Docker Stable Repository
25-
baseurl=https://yum.dockerproject.org/repo/main/{{.OsRelease}}/{{.OsReleaseVersion}}
26-
priority=1
27-
enabled=1
28-
gpgkey=https://yum.dockerproject.org/gpg
29-
`
30-
engineConfigTemplate = `[Service]
22+
engineConfigTemplate = `[Service]
3123
ExecStart=
3224
ExecStart=/usr/bin/dockerd -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 }}
3325
Environment={{range .EngineOptions.Env}}{{ printf "%q" . }} {{end}}
3426
`
35-
3627
majorVersionRE = regexp.MustCompile(`^(\d+)(\..*)?`)
3728
)
3829

@@ -95,6 +86,8 @@ func (provisioner *RedHatProvisioner) Package(name string, action pkgaction.Pack
9586
packageAction = "install"
9687
case pkgaction.Remove:
9788
packageAction = "remove"
89+
case pkgaction.Purge:
90+
packageAction = "remove"
9891
case pkgaction.Upgrade:
9992
packageAction = "upgrade"
10093
}

libmachine/provision/ubuntu_systemd.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,11 +60,14 @@ func (provisioner *UbuntuSystemdProvisioner) Package(name string, action pkgacti
6060
case pkgaction.Remove:
6161
packageAction = "remove"
6262
updateMetadata = false
63+
case pkgaction.Purge:
64+
packageAction = "purge"
65+
updateMetadata = false
6366
}
6467

6568
switch name {
6669
case "docker":
67-
name = "docker-engine"
70+
name = "docker-ce"
6871
}
6972

7073
if updateMetadata {

0 commit comments

Comments
 (0)
X Tutup