Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 90 You must be signed in to star a gist
  • Fork 21 You must be signed in to fork a gist
  • Save andystanton/257fab335b242bc2658b to your computer and use it in GitHub Desktop.
Save andystanton/257fab335b242bc2658b to your computer and use it in GitHub Desktop.
Start up local Docker Machine on OSX automatically.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>{{user-path}}</string>
</dict>
<key>Label</key>
<string>com.docker.machine.default</string>
<key>ProgramArguments</key>
<array>
<string>{{docker-machine}}</string>
<string>start</string>
<string>default</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>

Notice

This script is no longer required with Docker for Mac which includes an option to run Docker at startup and doesn't use docker-machine to administer the local Docker engine.

Requirements

  • Docker Machine + Docker
  • curl
  • A Virtualbox-driven Docker Machine called "default" docker-machine create --driver virtualbox default (this is the default with Docker toolkit).

Usage

$ curl -sL https://gist.githubusercontent.com/andystanton/257fab335b242bc2658b/raw/c62ae413a0a45ec5d832fb04065a085a8fb477da/com.docker.machine.default.plist | \
    sed -e "s?{{docker-machine}}?$(which docker-machine)?" \
        -e "s?{{user-path}}?$PATH?" \
    >~/Library/LaunchAgents/com.docker.machine.default.plist && \
    launchctl load ~/Library/LaunchAgents/com.docker.machine.default.plist
@andystanton
Copy link
Author

I'm glad it was useful @certik!

Copy link

ghost commented Apr 12, 2016

@certik this worked for me! Thanks again @andystanton

@TrevorSayre
Copy link

TrevorSayre commented May 18, 2016

Why not place the following in your startup file
e.g. ~/.bashrc, ~/.zshrc, etc.

DOCKER_MACHINE="dev"
if docker-machine status $DOCKER_MACHINE | grep "Running" &> /dev/null
  then
    eval "$(docker-machine env $DOCKER_MACHINE)"
  else
    docker-machine start $DOCKER_MACHINE && eval "$(docker-machine env $DOCKER_MACHINE)"
fi

For fish place the following in ~/.config/fish/config.fish

set DOCKER_MACHINE dev
if docker-machine status $DOCKER_MACHINE | grep "Running" > /dev/null
  eval (docker-machine env $DOCKER_MACHINE)
else
  docker-machine start $DOCKER_MACHINE and eval (docker-machine env $DOCKER_MACHINE)
end

@andystanton
Copy link
Author

@TrevorSayre that starts Docker only when you begin a terminal session after logging in. Using the launchctl script starts Docker when you log in, and is agnostic to what shell you use.

@TrevorSayre
Copy link

@andystanton Thank you for the response. I guess that difference doesn't affect me, I only use Docker in my terminal.

@ellisio
Copy link

ellisio commented Jun 30, 2016

For some reason this does not start my Docker Machine on boot. OS-X 10.11.5 running the latest Docker Toolbox.

@andystanton
Copy link
Author

Hi @ellisio, can you let me know the output of the following commands:

echo $PATH
cat ~/Library/LaunchAgents/com.docker.machine.default.plist
launchctl list | grep docker
which docker-machine
docker-machine --version
docker-machine ls
which docker
docker --version

@im-kulikov
Copy link

@andystanton:

echo $PATH

/Users/kulikov-im/.yarn/bin:/usr/local/sbin:/Users/kulikov-im/.yarn/bin:/usr/local/sbin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Users/kulikov-im/.rvm/bin:/Users/kulikov-im/Library/Android/sdk/tools:/Users/kulikov-im/Library/Android/sdk/platform-tools:/Users/kulikov-im/.rvm/bin:/Users/kulikov-im/.rvm/bin:/Users/kulikov-im/.golang//bin

cat ~/Library/LaunchAgents/com.docker.machine.dev.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
    <dict>
        <key>EnvironmentVariables</key>
        <dict>
            <key>PATH</key>
            <string>/Users/kulikov-im/.yarn/bin:/usr/local/sbin:/Users/kulikov-im/.yarn/bin:/usr/local/sbin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/Users/kulikov-im/.rvm/bin:/Users/kulikov-im/Library/Android/sdk/tools:/Users/kulikov-im/Library/Android/sdk/platform-tools:/Users/kulikov-im/.rvm/bin:/Users/kulikov-im/.rvm/bin:/Users/kulikov-im/.golang//bin</string>
        </dict>
        <key>Label</key>
        <string>com.docker.machine.default</string>
        <key>ProgramArguments</key>
        <array>
            <string>/usr/local/bin/docker-machine</string>
            <string>start</string>
            <string>dev</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>StandardErrorPath</key>
        <string>/usr/local/var/log/dockermachine-errors.log</string>
        <key>StandardOutPath</key>
        <string>/usr/local/var/log/dockermachine-status.log</string>
    </dict>
</plist>

launchctl list | grep docker

$ launchctl list | grep docker
2805    0   com.docker.machine.default

which docker-machine:

/usr/local/bin/docker-machine

docker-machine --version:

docker-machine version 0.8.2, build e18a919

docker-machine ls:

$ docker-machine ls
NAME   ACTIVE   DRIVER   STATE     URL   SWARM   DOCKER   ERRORS
dev             xhyve    Timeout

which docker:

$ which docker
/usr/local/bin/docker

docker --version:

$ docker --version
Docker version 1.12.1, build 23cf638

StandardErrorPath + StandardOutPath:

==> /usr/local/var/log/dockermachine-errors.log <==

==> /usr/local/var/log/dockermachine-status.log <==
Starting "dev"...
(dev) Waiting for VM to come online...
(dev) Waiting on a pseudo-terminal to be ready... done
(dev) Hook up your terminal emulator to /dev/ttys003 in order to connect to your VM

==> /usr/local/var/log/dockermachine-errors.log <==
Too many retries waiting for SSH to be available.  Last error: Maximum number of retries (60) exceeded

@im-kulikov
Copy link

@andystanton if I add --debug to run command, like this docker-machine --debug start dev, then i see next (looping this message):

(dev) DBG | SSH cmd err, output: exit status 255:
(dev) DBG | Error getting ssh command 'exit 0' : Something went wrong running an SSH command!
(dev) DBG | command : exit 0
(dev) DBG | err     : exit status 255
(dev) DBG | output  :
(dev) DBG |
(dev) DBG | Getting to WaitForSSH function...
(dev) DBG | Using SSH client type: external
(dev) DBG | {[-o BatchMode=yes -o PasswordAuthentication=no -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o LogLevel=quiet -o ConnectionAttempts=3 -o ConnectTimeout=10 -o ControlMaster=no -o ControlPath=none docker@192.168.64.14 -o IdentitiesOnly=yes -i /Users/kulikov-im/.docker/machine/machines/dev/id_rsa -p 22] /usr/bin/ssh}
(dev) DBG | About to run SSH command:
(dev) DBG | exit 0

@suplo
Copy link

suplo commented Nov 2, 2016

In my case, I want to start the docker-machine when booting (not when user logging in), so I put com.docker.machine.dev.plist into /Library/LaunchDaemons/, add

<key>UserName</key>
<string>{{ your_username }}</string>

as running docker-machine as root will throw Host does not exist: "default"

beside that, change file's owner to root:wheel

sudo chown root:wheel /Library/LaunchDaemons/com.docker.machine.dev.plist

then everything is fine.

@msabramo
Copy link

This worked great for me. Thanks, @andystanton!

@rantoniuk
Copy link

Good job, thanks @andystanton!

@jbarlow83
Copy link

For homebrew users:
brew services start docker-machine

@andysign
Copy link

In my case the entire process of starting up the docker-machine was slow... because of that I was forced to add the following:
while [ "$(docker-machine ls --filter name=default -f '{{.Error}}')" != "" ] && [ "$(docker-machine ls --filter name=default -f '{{.URL}}')" == "" ]; do sleep 1; done; eval $(docker-machine env default);
in
.bash_profile

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment