Docker.app 附带的 Docker 版本更新
自发布此答案以来,macOS 上的 Docker 体验得到了改善:
默认情况下,Docker.app 在登录时启动(您可以通过其首选项进行更改)。
如果您更喜欢从命令行按需启动和停止 Docker,这里有 bash 脚本这样做,docker-start 和 docker-stop;将它们放在您的$PATH 中的任何位置。
当docker-start 启动Docker.app 时,它会等待Docker 完成启动并准备就绪。
docker-start:
#!/usr/bin/env bash
case $1 in
-h|--help)
echo $'usage: docker-start\n\nStarts Docker (Docker.app) on macOS and waits until the Docker environment is initialized.'
exit 0
;;
esac
(( $# )) && { echo "ARGUMENT ERROR: Unexpected argument(s) specified. Use -h for help." >&2; exit 2; }
[[ $(uname) == 'Darwin' ]] || { echo "This function only runs on macOS." >&2; exit 2; }
echo "-- Starting Docker.app, if necessary..."
open -g -a Docker.app || exit
# Wait for the server to start up, if applicable.
i=0
while ! docker system info &>/dev/null; do
(( i++ == 0 )) && printf %s '-- Waiting for Docker to finish starting up...' || printf '.'
sleep 1
done
(( i )) && printf '\n'
echo "-- Docker is ready."
docker-stop:
#!/usr/bin/env bash
case $1 in
-h|--help)
echo $'usage: docker-stop\n\nStops Docker (Docker.app) on macOS.'
exit 0
;;
esac
(( $# )) && { echo "ARGUMENT ERROR: Unexpected argument(s) specified. Use -h for help." >&2; exit 2; }
[[ $(uname) == 'Darwin' ]] || { echo "This function only runs on macOS." >&2; exit 2; }
echo "-- Quitting Docker.app, if running..."
osascript - <<'EOF' || exit
tell application "Docker"
if it is running then quit it
end tell
EOF
echo "-- Docker is stopped."
echo "Caveat: Restarting it too quickly can cause errors."
原始的、过时的答案:
Kevan Ahlquist's helpful answer 显示了要添加到您的 Bash 配置文件 (~/.bash_profile) 以在打开交互式 shell 时自动初始化 Docker 的命令。
请注意,您始终可以通过打开应用程序 /Applications/Docker/Docker Quickstart Terminal.app(例如,通过 Spotlight)在 new shell 选项卡/窗口中初始化 Docker。
在现有的 shell 中,您可以以 open -a 'Docker Quickstart Terminal.app' 的形式调用它(这也会打开 new shell 选项卡)。
这个答案提供了一种在 current shell 中启动 Docker 的便捷方式。
在下面添加 Bash shell 函数 - docker-start 和 docker-stop - 在以下方面改进了 Kevan 的方法:
您可以运行docker-start on demand,而无需在 打开 shell 时启动 VM 的开销(一旦 Docker VM 运行,初始化是快得多,但仍然需要相当长的时间)。
(当然,您仍然可以选择直接从您的个人资料中调用docker-start。)
docker-stop 允许停止 Docker 并按需清理环境变量。
这些函数确保 Docker 的错误消息不被抑制,并且它们通过 Docker 错误退出代码。
提供了额外的状态信息。
您可以将 VM 名称作为参数传递;默认为default。
例子:
$ docker-start
-- Starting Docker VM 'default' (`docker-machine start default`; this will take a while)...
Starting "default"...
(default) Check network to re-create if needed...
(default) Waiting for an IP...
Machine "default" was started.
Waiting for SSH to be available...
Detecting the provisioner...
Started machines may have new IP addresses. You may need to re-run the `docker-machine env` command.
-- Setting DOCKER_* environment variables (`eval "$(docker-machine env default)"`)...
DOCKER_CERT_PATH="/Users/jdoe/.docker/machine/machines/default"
DOCKER_HOST="tcp://192.168.99.100:2376"
DOCKER_MACHINE_NAME="default"
DOCKER_TLS_VERIFY="1"
-- Docker VM 'default' is running.
$ docker-stop
-- Stopping Docker VM 'default' (`docker-machine stop default`)...
Stopping "default"...
Machine "default" was stopped.
-- Unsetting DOCKER_* environment variables (DOCKER_CERT_PATH, DOCKER_HOST, DOCKER_MACHINE_NAME, DOCKER_TLS_VERIFY)...
-- Docker VM 'default' is stopped.
用于按需启动和停止 Docker 的 Shell 函数(将它们放入,例如,~/.bash_profile 以在您的交互式 Shell 中实现全局可用性)。
注意:函数在 bash、ksh 和 zsh 中有效,但在 ksh 中,您必须重命名它们,以免在函数名。
function docker-start {
typeset vm=${1:-default} sts
case $vm in
-h|--help)
echo $'usage: docker-start [<vm>]\n\nEnsures that the specified/default Docker VM is started\nand the environment is initialized.'
return 0
;;
esac
sts=$(docker-machine status "$vm") || return
[[ $sts == 'Running' ]] && echo "(Docker VM '$vm' is already running.)" || {
echo "-- Starting Docker VM '$vm' (\`docker-machine start "$vm"\`; this will take a while)...";
docker-machine start "$vm" || return
}
echo "-- Setting DOCKER_* environment variables (\`eval \"\$(docker-machine env "$vm")\"\`)..."
# Note: If the machine hasn't fully finished starting up yet from a
# previously launched-but-not-waited-for-completion `docker-machine status`,
# the following may output error messages; alas, without signaling failure
# via the exit code. Simply rerun this function to retry.
eval "$(docker-machine env "$vm")" || return
export | grep -o 'DOCKER_.*'
echo "-- Docker VM '$vm' is running."
}
function docker-stop {
typeset vm=${1:-default} sts envVarNames fndx
case $vm in
-h|--help)
echo $'usage: docker-stop [<vm>]\n\nEnsures that the specified/default Docker VM is stopped\nand the environment is cleaned up.'
return 0
;;
esac
sts=$(docker-machine status "$vm") || return
[[ $sts == 'Running' ]] && {
echo "-- Stopping Docker VM '$vm' (\`docker-machine stop "$vm"\`)...";
docker-machine stop "$vm" || return
} || echo "(Docker VM '$vm' is not running.)"
[[ -n $BASH_VERSION ]] && fndx=3 || fndx=1 # Bash prefixes defs. wit 'declare -x '
envVarNames=( $(export | awk -v fndx="$fndx" '$fndx ~ /^DOCKER_/ { sub(/=.*/,"", $fndx); print $fndx }') )
if [[ -n $envVarNames ]]; then
echo "-- Unsetting DOCKER_* environment variables ($(echo "${envVarNames[@]}" | sed 's/ /, /g'))..."
unset "${envVarNames[@]}"
else
echo "(No DOCKER_* environment variables to unset.)"
fi
echo "-- Docker VM '$vm' is stopped."
}