Compare commits
33 Commits
v0.11.0
...
v0.12.0-rc
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
64fa4591bb | ||
|
|
c604d46dc5 | ||
|
|
95666999ac | ||
|
|
1996e15726 | ||
|
|
b137a6a835 | ||
|
|
1dd0729124 | ||
|
|
1532bc1a4d | ||
|
|
59c53323f6 | ||
|
|
209e033172 | ||
|
|
4c5139775d | ||
|
|
fc0fe0e4df | ||
|
|
29bb630bae | ||
|
|
d889abc352 | ||
|
|
fb6f177eea | ||
|
|
9f441e68d1 | ||
|
|
c82b52c797 | ||
|
|
73eb78d6aa | ||
|
|
39e6b192a6 | ||
|
|
2ea653b5e3 | ||
|
|
e8da55a0fa | ||
|
|
e94ccb6f10 | ||
|
|
ffd9511da5 | ||
|
|
9e92ef1af4 | ||
|
|
e2bf2d018c | ||
|
|
fd9a0a683c | ||
|
|
bd3211dbdf | ||
|
|
1729729eb3 | ||
|
|
41bd6e3288 | ||
|
|
77f0396d17 | ||
|
|
43c3e62c2a | ||
|
|
96a609fb68 | ||
|
|
705c3683ec | ||
|
|
8c89512033 |
@@ -1,4 +1,4 @@
|
||||
FROM golang:1.7.4
|
||||
FROM golang:1.8.3
|
||||
|
||||
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
openssh-client \
|
||||
|
||||
@@ -14,7 +14,6 @@
|
||||
"dgageot",
|
||||
"ehazlett",
|
||||
"jeanlaurent",
|
||||
"nathanleclaire",
|
||||
]
|
||||
|
||||
[people]
|
||||
@@ -39,8 +38,3 @@
|
||||
Name = "Jean-Laurent de Morlhon"
|
||||
Email = "jeanlaurent@docker.com>"
|
||||
GitHub = "jeanlaurent"
|
||||
|
||||
[people.nathanleclaire]
|
||||
Name = "Nathan LeClaire"
|
||||
Email = "nathan.leclaire@docker.com"
|
||||
GitHub = "nathanleclaire"
|
||||
|
||||
@@ -20,10 +20,37 @@ _docker_machine_q() {
|
||||
docker-machine 2>/dev/null "$@"
|
||||
}
|
||||
|
||||
# suppresses trailing whitespace
|
||||
_docker_machine_nospace() {
|
||||
# compopt is not available in ancient bash versions (OSX)
|
||||
# so only call it if it's available
|
||||
type compopt &>/dev/null && compopt -o nospace
|
||||
}
|
||||
|
||||
_docker_machine_machines() {
|
||||
_docker_machine_q ls --format '{{.Name}}' "$@"
|
||||
}
|
||||
|
||||
_docker_machine_drivers() {
|
||||
local drivers=(
|
||||
amazonec2
|
||||
azure
|
||||
digitalocean
|
||||
exoscale
|
||||
generic
|
||||
google
|
||||
hyperv
|
||||
openstack
|
||||
rackspace
|
||||
softlayer
|
||||
virtualbox
|
||||
vmwarefusion
|
||||
vmwarevcloudair
|
||||
vmwarevsphere
|
||||
)
|
||||
echo "${drivers[@]}"
|
||||
}
|
||||
|
||||
_docker_machine_value_of_option() {
|
||||
local pattern="$1"
|
||||
for (( i=2; i < ${cword}; ++i)); do
|
||||
@@ -34,6 +61,31 @@ _docker_machine_value_of_option() {
|
||||
done
|
||||
}
|
||||
|
||||
# Returns `key` if we are currently completing the value of a map option
|
||||
# (`key=value`) which matches the extglob passed in as an argument.
|
||||
# This function is needed for key-specific argument completions.
|
||||
_docker_machine_map_key_of_current_option() {
|
||||
local glob="$1"
|
||||
|
||||
local key glob_pos
|
||||
if [ "$cur" = "=" ] ; then # key= case
|
||||
key="$prev"
|
||||
glob_pos=$((cword - 2))
|
||||
elif [[ $cur == *=* ]] ; then # key=value case (OSX)
|
||||
key=${cur%=*}
|
||||
glob_pos=$((cword - 1))
|
||||
elif [ "$prev" = "=" ] ; then
|
||||
key=${words[$cword - 2]} # key=value case
|
||||
glob_pos=$((cword - 3))
|
||||
else
|
||||
return
|
||||
fi
|
||||
|
||||
[ "${words[$glob_pos]}" = "=" ] && ((glob_pos--)) # --option=key=value syntax
|
||||
|
||||
[[ ${words[$glob_pos]} == @($glob) ]] && echo "$key"
|
||||
}
|
||||
|
||||
# --- completion functions ---------------------------------------------------
|
||||
|
||||
_docker_machine_active() {
|
||||
@@ -59,21 +111,7 @@ _docker_machine_config() {
|
||||
_docker_machine_create() {
|
||||
case "${prev}" in
|
||||
--driver|-d)
|
||||
COMPREPLY=($(compgen -W "
|
||||
amazonec2
|
||||
azure
|
||||
digitalocean
|
||||
exoscale
|
||||
generic
|
||||
google
|
||||
hyperv
|
||||
openstack
|
||||
rackspace
|
||||
softlayer
|
||||
virtualbox
|
||||
vmwarefusion
|
||||
vmwarevcloudair
|
||||
vmwarevsphere" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "$(_docker_machine_drivers)" -- "${cur}"))
|
||||
return
|
||||
;;
|
||||
esac
|
||||
@@ -142,8 +180,25 @@ _docker_machine_kill() {
|
||||
}
|
||||
|
||||
_docker_machine_ls() {
|
||||
local key=$(_docker_machine_map_key_of_current_option '--filter')
|
||||
case "$key" in
|
||||
driver)
|
||||
COMPREPLY=($(compgen -W "$(_docker_machine_drivers)" -- "${cur##*=}"))
|
||||
return
|
||||
;;
|
||||
state)
|
||||
COMPREPLY=($(compgen -W "Error Paused Running Saved Starting Stopped Stopping" -- "${cur##*=}"))
|
||||
return
|
||||
;;
|
||||
esac
|
||||
|
||||
case "${prev}" in
|
||||
--filter|--format|-f|--timeout|-t)
|
||||
--filter)
|
||||
COMPREPLY=($(compgen -W "driver label name state swarm" -S= -- "${cur}"))
|
||||
_docker_machine_nospace
|
||||
return
|
||||
;;
|
||||
--format|-f|--timeout|-t)
|
||||
return
|
||||
;;
|
||||
esac
|
||||
@@ -153,11 +208,19 @@ _docker_machine_ls() {
|
||||
fi
|
||||
}
|
||||
|
||||
_docker_machine_provision() {
|
||||
if [[ "${cur}" == -* ]]; then
|
||||
COMPREPLY=($(compgen -W "--help" -- "${cur}"))
|
||||
else
|
||||
COMPREPLY=($(compgen -W "$(_docker_machine_machines --filter state=Running)" -- "${cur}"))
|
||||
fi
|
||||
}
|
||||
|
||||
_docker_machine_regenerate_certs() {
|
||||
if [[ "${cur}" == -* ]]; then
|
||||
COMPREPLY=($(compgen -W "--force -f --help" -- "${cur}"))
|
||||
else
|
||||
COMPREPLY=($(compgen -W "$(_docker_machine_machines)" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "$(_docker_machine_machines --filter state=Running)" -- "${cur}"))
|
||||
fi
|
||||
}
|
||||
|
||||
@@ -187,7 +250,7 @@ _docker_machine_ssh() {
|
||||
|
||||
_docker_machine_scp() {
|
||||
if [[ "${cur}" == -* ]]; then
|
||||
COMPREPLY=($(compgen -W "--help --recursive -r" -- "${cur}"))
|
||||
COMPREPLY=($(compgen -W "--delta -d --help --recursive -r" -- "${cur}"))
|
||||
else
|
||||
_filedir
|
||||
# It would be really nice to ssh to the machine and ls to complete
|
||||
@@ -266,7 +329,7 @@ _docker_machine_docker_machine() {
|
||||
|
||||
_docker_machine() {
|
||||
COMPREPLY=()
|
||||
local commands=(active config create env inspect ip kill ls regenerate-certs restart rm ssh scp start status stop upgrade url version help)
|
||||
local commands=(active config create env inspect ip kill ls provision regenerate-certs restart rm ssh scp start status stop upgrade url version help)
|
||||
|
||||
local flags=(--debug --native-ssh --github-api-token --bugsnag-api-token --help --version)
|
||||
local wants_dir=(--storage-path)
|
||||
|
||||
@@ -950,6 +950,13 @@ func (d *Driver) terminate() error {
|
||||
_, err := d.getClient().TerminateInstances(&ec2.TerminateInstancesInput{
|
||||
InstanceIds: []*string{&d.InstanceId},
|
||||
})
|
||||
|
||||
if strings.HasPrefix(err.Error(), "unknown instance") ||
|
||||
strings.HasPrefix(err.Error(), "InvalidInstanceID.NotFound") {
|
||||
log.Warn("Remote instance does not exist, proceeding with removing local reference")
|
||||
return nil
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("unable to terminate instance: %s", err)
|
||||
}
|
||||
|
||||
@@ -196,6 +196,7 @@ func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
|
||||
if !d.UseExisting {
|
||||
d.MachineType = flags.String("google-machine-type")
|
||||
d.MachineImage = flags.String("google-machine-image")
|
||||
d.MachineImage = strings.TrimPrefix(d.MachineImage, "https://www.googleapis.com/compute/v1/projects/")
|
||||
d.DiskSize = flags.Int("google-disk-size")
|
||||
d.DiskType = flags.String("google-disk-type")
|
||||
d.Address = flags.String("google-address")
|
||||
|
||||
@@ -6,8 +6,6 @@ import (
|
||||
"os"
|
||||
"time"
|
||||
|
||||
"errors"
|
||||
|
||||
"github.com/docker/machine/libmachine/drivers"
|
||||
"github.com/docker/machine/libmachine/log"
|
||||
"github.com/docker/machine/libmachine/mcnflag"
|
||||
@@ -94,9 +92,6 @@ func (d *Driver) GetCreateFlags() []mcnflag.Flag {
|
||||
}
|
||||
|
||||
func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
|
||||
if drivers.EngineInstallURLFlagSet(flags) {
|
||||
return errors.New("--engine-install-url cannot be used with the hyperv driver, use --hyperv-boot2docker-url instead")
|
||||
}
|
||||
d.Boot2DockerURL = flags.String("hyperv-boot2docker-url")
|
||||
d.VSwitch = flags.String("hyperv-virtual-switch")
|
||||
d.DiskSize = flags.Int("hyperv-disk-size")
|
||||
|
||||
@@ -596,7 +596,7 @@ func (c *GenericClient) SetTLSConfig(d *Driver) error {
|
||||
config.RootCAs = certpool
|
||||
}
|
||||
|
||||
transport := &http.Transport{TLSClientConfig: config}
|
||||
transport := &http.Transport{TLSClientConfig: config, Proxy: http.ProxyFromEnvironment}
|
||||
c.Provider.HTTPClient.Transport = transport
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -228,9 +228,6 @@ func (d *Driver) GetURL() (string, error) {
|
||||
}
|
||||
|
||||
func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
|
||||
if drivers.EngineInstallURLFlagSet(flags) {
|
||||
return errors.New("--engine-install-url cannot be used with the virtualbox driver, use --virtualbox-boot2docker-url instead")
|
||||
}
|
||||
d.CPU = flags.Int("virtualbox-cpu-count")
|
||||
d.Memory = flags.Int("virtualbox-memory")
|
||||
d.DiskSize = flags.Int("virtualbox-disk-size")
|
||||
|
||||
@@ -18,8 +18,6 @@ import (
|
||||
"text/template"
|
||||
"time"
|
||||
|
||||
"errors"
|
||||
|
||||
"github.com/docker/machine/libmachine/drivers"
|
||||
"github.com/docker/machine/libmachine/log"
|
||||
"github.com/docker/machine/libmachine/mcnflag"
|
||||
@@ -145,9 +143,6 @@ func (d *Driver) DriverName() string {
|
||||
}
|
||||
|
||||
func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
|
||||
if drivers.EngineInstallURLFlagSet(flags) {
|
||||
return errors.New("--engine-install-url cannot be used with the vmwarefusion driver, use --vmwarefusion-boot2docker-url instead")
|
||||
}
|
||||
d.Memory = flags.Int("vmwarefusion-memory-size")
|
||||
d.CPU = flags.Int("vmwarefusion-cpu-count")
|
||||
d.DiskSize = flags.Int("vmwarefusion-disk-size")
|
||||
@@ -368,7 +363,10 @@ func (d *Driver) Create() error {
|
||||
vmrun("-gu", B2DUser, "-gp", B2DPass, "CopyFileFromHostToGuest", d.vmxPath(), d.ResolveStorePath("userdata.tar"), "/home/docker/userdata.tar")
|
||||
|
||||
// Expand tar file.
|
||||
vmrun("-gu", B2DUser, "-gp", B2DPass, "runScriptInGuest", d.vmxPath(), "/bin/sh", "sudo /bin/mv /home/docker/userdata.tar /var/lib/boot2docker/userdata.tar && sudo tar xf /var/lib/boot2docker/userdata.tar -C /home/docker/ > /var/log/userdata.log 2>&1 && sudo chown -R docker:staff /home/docker")
|
||||
vmrun("-gu", B2DUser, "-gp", B2DPass, "runScriptInGuest", d.vmxPath(), "/bin/sh", "sudo sh -c \"tar xvf userdata.tar -C /home/docker > /var/log/userdata.log 2>&1 && chown -R docker:staff /home/docker\"")
|
||||
|
||||
// copy to /var/lib/boot2docker
|
||||
vmrun("-gu", B2DUser, "-gp", B2DPass, "runScriptInGuest", d.vmxPath(), "/bin/sh", "sudo /bin/mv /home/docker/userdata.tar /var/lib/boot2docker/userdata.tar")
|
||||
|
||||
// Enable Shared Folders
|
||||
vmrun("-gu", B2DUser, "-gp", B2DPass, "enableSharedFolders", d.vmxPath())
|
||||
|
||||
@@ -183,9 +183,6 @@ func (d *Driver) DriverName() string {
|
||||
}
|
||||
|
||||
func (d *Driver) SetConfigFromFlags(flags drivers.DriverOptions) error {
|
||||
if drivers.EngineInstallURLFlagSet(flags) {
|
||||
return errors.New("--engine-install-url cannot be used with the vmwarevsphere driver, use --vmwarevsphere-boot2docker-url instead")
|
||||
}
|
||||
d.SSHUser = "docker"
|
||||
d.SSHPort = 22
|
||||
d.CPU = flags.Int("vmwarevsphere-cpu-count")
|
||||
@@ -554,10 +551,25 @@ func (d *Driver) Create() error {
|
||||
return err
|
||||
}
|
||||
|
||||
// first, untar - only boot2docker has /var/lib/boot2docker
|
||||
// TODO: don't hard-code to docker & staff - they are also just b2d
|
||||
var env []string
|
||||
guestspec := types.GuestProgramSpec{
|
||||
ProgramPath: "/usr/bin/sudo",
|
||||
Arguments: "/bin/mv /home/docker/userdata.tar /var/lib/boot2docker/userdata.tar && /usr/bin/sudo tar xf /var/lib/boot2docker/userdata.tar -C /home/docker/ > /var/log/userdata.log 2>&1 && /usr/bin/sudo chown -R docker:staff /home/docker",
|
||||
Arguments: "/usr/bin/sudo /bin/sh -c \"tar xvf userdata.tar -C /home/docker > /var/log/userdata.log 2>&1 && chown -R docker:staff /home/docker\"",
|
||||
WorkingDirectory: "",
|
||||
EnvVariables: env,
|
||||
}
|
||||
|
||||
_, err = procman.StartProgram(ctx, auth.Auth(), &guestspec)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// now move to /var/lib/boot2docker if its there
|
||||
guestspec = types.GuestProgramSpec{
|
||||
ProgramPath: "/usr/bin/sudo",
|
||||
Arguments: "/bin/mv /home/docker/userdata.tar /var/lib/boot2docker/userdata.tar",
|
||||
WorkingDirectory: "",
|
||||
EnvVariables: env,
|
||||
}
|
||||
|
||||
@@ -86,6 +86,9 @@ func (d *BaseDriver) SetSwarmConfigFromFlags(flags DriverOptions) {
|
||||
}
|
||||
|
||||
func EngineInstallURLFlagSet(flags DriverOptions) bool {
|
||||
engineInstallURLFlag := flags.String("engine-install-url")
|
||||
return engineInstallURLFlag != DefaultEngineInstallURL && engineInstallURLFlag != ""
|
||||
return EngineInstallURLSet(flags.String("engine-install-url"))
|
||||
}
|
||||
|
||||
func EngineInstallURLSet(url string) bool {
|
||||
return url != DefaultEngineInstallURL && url != ""
|
||||
}
|
||||
|
||||
@@ -93,6 +93,8 @@ func (provisioner *RancherProvisioner) Package(name string, action pkgaction.Pac
|
||||
}
|
||||
|
||||
func (provisioner *RancherProvisioner) Provision(swarmOptions swarm.Options, authOptions auth.Options, engineOptions engine.Options) error {
|
||||
log.Debugf("Running RancherOS provisioner on %s", provisioner.Driver.GetMachineName())
|
||||
|
||||
provisioner.SwarmOptions = swarmOptions
|
||||
provisioner.AuthOptions = authOptions
|
||||
provisioner.EngineOptions = engineOptions
|
||||
@@ -116,6 +118,11 @@ func (provisioner *RancherProvisioner) Provision(swarmOptions swarm.Options, aut
|
||||
}
|
||||
}
|
||||
|
||||
log.Debugf("Selecting docker engine: %s", engineOptions.InstallURL)
|
||||
if err := selectDocker(provisioner, engineOptions.InstallURL); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
log.Debugf("Preparing certificates")
|
||||
provisioner.AuthOptions = setRemoteAuthOptions(provisioner)
|
||||
|
||||
@@ -231,3 +238,12 @@ func (provisioner *RancherProvisioner) getLatestISOURL() (string, error) {
|
||||
|
||||
return "", fmt.Errorf("Failed to find current version")
|
||||
}
|
||||
|
||||
func selectDocker(p Provisioner, baseURL string) error {
|
||||
// TODO: detect if its a cloud-init, or a ros setting - and use that..
|
||||
if output, err := p.SSHCommand(fmt.Sprintf("wget -O- %s | sh -", baseURL)); err != nil {
|
||||
return fmt.Errorf("error selecting docker: (%s) %s", err, output)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -76,7 +76,7 @@ func (provisioner *UbuntuProvisioner) Package(name string, action pkgaction.Pack
|
||||
switch action {
|
||||
case pkgaction.Install, pkgaction.Upgrade:
|
||||
packageAction = "install"
|
||||
case pkgaction.Remove:
|
||||
case pkgaction.Remove, pkgaction.Purge:
|
||||
packageAction = "remove"
|
||||
updateMetadata = false
|
||||
}
|
||||
|
||||
@@ -201,7 +201,7 @@ func (client *NativeClient) OutputWithPty(command string) (string, error) {
|
||||
defer closeConn(conn)
|
||||
defer session.Close()
|
||||
|
||||
fd := int(os.Stdin.Fd())
|
||||
fd := int(os.Stdout.Fd())
|
||||
|
||||
termWidth, termHeight, err := terminal.GetSize(fd)
|
||||
if err != nil {
|
||||
|
||||
@@ -16,7 +16,7 @@ define gocross
|
||||
$(if $(findstring [$(1)/$(2)],$(VALID_OS_ARCH)), \
|
||||
GOOS=$(1) GOARCH=$(2) CGO_ENABLED=0 \
|
||||
$(GO) build \
|
||||
-o $(PREFIX)/bin/docker-machine-${os.$(1)}-${arch.$(2)}$(call extension,$(GOOS)) \
|
||||
-o $(PREFIX)/bin/$(PKG_NAME)-${os.$(1)}-${arch.$(2)}$(call extension,$(GOOS)) \
|
||||
-a $(VERBOSE_GO) -tags "static_build netgo $(BUILDTAGS)" -installsuffix netgo \
|
||||
-ldflags "$(GO_LDFLAGS) -extldflags -static" $(GO_GCFLAGS) ./cmd/machine.go;)
|
||||
endef
|
||||
@@ -27,10 +27,10 @@ build-clean:
|
||||
build-x: $(shell find . -type f -name '*.go')
|
||||
$(foreach GOARCH,$(TARGET_ARCH),$(foreach GOOS,$(TARGET_OS),$(call gocross,$(GOOS),$(GOARCH))))
|
||||
|
||||
$(PREFIX)/bin/docker-machine$(call extension,$(GOOS)): $(shell find . -type f -name '*.go')
|
||||
$(PREFIX)/bin/$(PKG_NAME)$(call extension,$(GOOS)): $(shell find . -type f -name '*.go')
|
||||
$(GO) build \
|
||||
-o $@ \
|
||||
$(VERBOSE_GO) -tags "$(BUILDTAGS)" \
|
||||
-ldflags "$(GO_LDFLAGS)" $(GO_GCFLAGS) ./cmd/machine.go
|
||||
|
||||
build: $(PREFIX)/bin/docker-machine$(call extension,$(GOOS))
|
||||
build: $(PREFIX)/bin/$(PKG_NAME)$(call extension,$(GOOS))
|
||||
|
||||
@@ -49,7 +49,7 @@ include mk/validate.mk
|
||||
default: build
|
||||
|
||||
install:
|
||||
cp $(PREFIX)/bin/docker-machine /usr/local/bin
|
||||
cp $(PREFIX)/bin/$(PKG_NAME) /usr/local/bin
|
||||
|
||||
clean: coverage-clean build-clean
|
||||
test: dco fmt test-short lint vet
|
||||
|
||||
@@ -6,8 +6,7 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
// Version should be updated by hand at each release
|
||||
Version = "0.10.0"
|
||||
Version = "0.12.0-rc2"
|
||||
|
||||
// GitCommit will be overwritten automatically by the build system
|
||||
GitCommit = "HEAD"
|
||||
|
||||
Reference in New Issue
Block a user