eval$(docker-machine env <machine name>) 似乎在 shell 脚本中工作,但立即失败
eval$(docker-machine env <machine name>) appears to work in shell script, but fails immediately
在 macOS High Sierra 上为 Docker 设置一组虚拟机(使用 Docker Desktop 2.0.5.0,但这在过去的版本中发生过。)我 运行以下 shell 脚本:
#!/bin/bash
# some variables
MANAGER="swarmMGR"
WORKER="swarmWKR"
MAXNODE=3
# create VMs for swarm
# manager
docker-machine create --driver virtualbox $MANAGER
# workers
for (( i=1; i<=$MAXNODE; i++ ))
do
docker-machine create --driver virtualbox $WORKER$i
done
# find the manager's IP address
MANAGERIP=$(docker-machine ls | grep $MANAGER | egrep -o '([0-9]{1,3}[.]){3}[0-9]{1,3}')
# initialize the swarm
docker-machine ssh ${MANAGER} "docker swarm init --advertise-addr $MANAGERIP"
# workers join the swarm
# get the token
TOKEN=$(docker-machine ssh $MANAGER "docker swarm join-token worker -q")
# join up
for (( i=1; i<=$MAXNODE; i++ ))
do
echo
docker-machine ssh $WORKER$i "docker swarm join --token ${TOKEN} ${MANAGERIP}"
done
# configure the shell to expose the manager for Docker commands from the host
eval $(docker-machine env $MANAGER)
# list the machines
docker-machine ls
# list the nodes
docker-machine ssh $MANAGER "docker node ls"
eval $(docker-machine env $MANAGER)
似乎有效 - 这是脚本末尾的输出:
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
swarmMGR * virtualbox Running tcp://192.168.99.197:2376 v18.09.6
swarmWKR1 - virtualbox Running tcp://192.168.99.198:2376 v18.09.6
swarmWKR2 - virtualbox Running tcp://192.168.99.199:2376 v18.09.6
swarmWKR3 - virtualbox Running tcp://192.168.99.200:2376 v18.09.6
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ub2qbyd6ca8yzgsq1f0mjsp0i * swarmMGR Ready Active Leader 18.09.6
dopxb7bgyixqyh3z66rvtik2o swarmWKR1 Ready Active 18.09.6
vwbd11l36idnphdsoutls2hvp swarmWKR2 Ready Active 18.09.6
oe80ejzvnhsmhosvjvus6cvb1 swarmWKR3 Ready Active 18.09.6
如果我执行一个简单的命令,比如 docker node ls
,它现在应该在 swarm 管理器上运行,我得到以下错误:
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
如果我手动 运行 eval()
命令,响应就会正确。我做了很多研究,但找不到解决问题的方法。
当 运行从脚本中执行 eval()
命令时,是否必须执行某些操作才能使其正常工作?
附加信息
我 运行 有问题的 shell 脚本部分带有 -x
选项以输出一些调试信息:
#!/bin/bash
MANAGER="swarmMGR"
# configure the shell to expose the manager for Docker commands from the host
eval $(docker-machine env "$MANAGER")
# list the machines
docker-machine ls
# list the nodes
docker-machine ssh $MANAGER "docker node ls"
echo $DOCKER_HOST
这是输出:
$ bash -x ./export.sh
+ MANAGER=swarmMGR
++ docker-machine env swarmMGR
+ eval export 'DOCKER_TLS_VERIFY="1"' export 'DOCKER_HOST="tcp://192.168.99.228:2376"' export 'DOCKER_CERT_PATH="/Users/foo/.docker/machine/machines/swarmMGR"' export 'DOCKER_MACHINE_NAME="swarmMGR"' '#' Run this command to configure your shell: '#' eval '$(docker-machine' env 'swarmMGR)'
++ export DOCKER_TLS_VERIFY=1 export DOCKER_HOST=tcp://192.168.99.228:2376 export DOCKER_CERT_PATH=/Users/foo/.docker/machine/machines/swarmMGR export DOCKER_MACHINE_NAME=swarmMGR
++ DOCKER_TLS_VERIFY=1
++ DOCKER_HOST=tcp://192.168.99.228:2376
++ DOCKER_CERT_PATH=/Users/jblanchard/.docker/machine/machines/swarmMGR
++ DOCKER_MACHINE_NAME=swarmMGR
+ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
swarmMGR * virtualbox Running tcp://192.168.99.228:2376 v18.09.6
swarmWKR1 - virtualbox Running tcp://192.168.99.229:2376 Unknown Unable to query docker version: Cannot connect to the docker engine endpoint
swarmWKR2 - virtualbox Running tcp://192.168.99.230:2376 v18.09.6
swarmWKR3 - virtualbox Running tcp://192.168.99.231:2376 v18.09.6
+ docker-machine ssh swarmMGR 'docker node ls'
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ryplgfjntuj7rfoapbl0bb8nj * swarmMGR Ready Active Leader 18.09.6
n89x4phb9jhilwz74zgta352r swarmWKR2 Ready Active 18.09.6
sp76b5vws2fcdpjuhxcqhywh3 swarmWKR3 Ready Active 18.09.6
+ echo tcp://192.168.99.228:2376
tcp://192.168.99.228:2376
只要脚本是'active',环境变量就设置正确了。当脚本退出时,变量将被取消设置,因为 运行ning echo $DOCKER_HOST
立即从命令行产生任何结果。
随着我继续研究这个问题,我终于在 this question on AskUbuntu. It turns out the environment variables exported during the running of the script do not persist. To correct that all I needed to do was run the script using source
中找到了答案,它导致导出的环境变量一直存在,直到取消设置:
source ./create_swarm.sh
或者,使用快捷方式
. ./create_swarm.sh
在 macOS High Sierra 上为 Docker 设置一组虚拟机(使用 Docker Desktop 2.0.5.0,但这在过去的版本中发生过。)我 运行以下 shell 脚本:
#!/bin/bash
# some variables
MANAGER="swarmMGR"
WORKER="swarmWKR"
MAXNODE=3
# create VMs for swarm
# manager
docker-machine create --driver virtualbox $MANAGER
# workers
for (( i=1; i<=$MAXNODE; i++ ))
do
docker-machine create --driver virtualbox $WORKER$i
done
# find the manager's IP address
MANAGERIP=$(docker-machine ls | grep $MANAGER | egrep -o '([0-9]{1,3}[.]){3}[0-9]{1,3}')
# initialize the swarm
docker-machine ssh ${MANAGER} "docker swarm init --advertise-addr $MANAGERIP"
# workers join the swarm
# get the token
TOKEN=$(docker-machine ssh $MANAGER "docker swarm join-token worker -q")
# join up
for (( i=1; i<=$MAXNODE; i++ ))
do
echo
docker-machine ssh $WORKER$i "docker swarm join --token ${TOKEN} ${MANAGERIP}"
done
# configure the shell to expose the manager for Docker commands from the host
eval $(docker-machine env $MANAGER)
# list the machines
docker-machine ls
# list the nodes
docker-machine ssh $MANAGER "docker node ls"
eval $(docker-machine env $MANAGER)
似乎有效 - 这是脚本末尾的输出:
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
swarmMGR * virtualbox Running tcp://192.168.99.197:2376 v18.09.6
swarmWKR1 - virtualbox Running tcp://192.168.99.198:2376 v18.09.6
swarmWKR2 - virtualbox Running tcp://192.168.99.199:2376 v18.09.6
swarmWKR3 - virtualbox Running tcp://192.168.99.200:2376 v18.09.6
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ub2qbyd6ca8yzgsq1f0mjsp0i * swarmMGR Ready Active Leader 18.09.6
dopxb7bgyixqyh3z66rvtik2o swarmWKR1 Ready Active 18.09.6
vwbd11l36idnphdsoutls2hvp swarmWKR2 Ready Active 18.09.6
oe80ejzvnhsmhosvjvus6cvb1 swarmWKR3 Ready Active 18.09.6
如果我执行一个简单的命令,比如 docker node ls
,它现在应该在 swarm 管理器上运行,我得到以下错误:
Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.
如果我手动 运行 eval()
命令,响应就会正确。我做了很多研究,但找不到解决问题的方法。
当 运行从脚本中执行 eval()
命令时,是否必须执行某些操作才能使其正常工作?
附加信息
我 运行 有问题的 shell 脚本部分带有 -x
选项以输出一些调试信息:
#!/bin/bash
MANAGER="swarmMGR"
# configure the shell to expose the manager for Docker commands from the host
eval $(docker-machine env "$MANAGER")
# list the machines
docker-machine ls
# list the nodes
docker-machine ssh $MANAGER "docker node ls"
echo $DOCKER_HOST
这是输出:
$ bash -x ./export.sh
+ MANAGER=swarmMGR
++ docker-machine env swarmMGR
+ eval export 'DOCKER_TLS_VERIFY="1"' export 'DOCKER_HOST="tcp://192.168.99.228:2376"' export 'DOCKER_CERT_PATH="/Users/foo/.docker/machine/machines/swarmMGR"' export 'DOCKER_MACHINE_NAME="swarmMGR"' '#' Run this command to configure your shell: '#' eval '$(docker-machine' env 'swarmMGR)'
++ export DOCKER_TLS_VERIFY=1 export DOCKER_HOST=tcp://192.168.99.228:2376 export DOCKER_CERT_PATH=/Users/foo/.docker/machine/machines/swarmMGR export DOCKER_MACHINE_NAME=swarmMGR
++ DOCKER_TLS_VERIFY=1
++ DOCKER_HOST=tcp://192.168.99.228:2376
++ DOCKER_CERT_PATH=/Users/jblanchard/.docker/machine/machines/swarmMGR
++ DOCKER_MACHINE_NAME=swarmMGR
+ docker-machine ls
NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS
swarmMGR * virtualbox Running tcp://192.168.99.228:2376 v18.09.6
swarmWKR1 - virtualbox Running tcp://192.168.99.229:2376 Unknown Unable to query docker version: Cannot connect to the docker engine endpoint
swarmWKR2 - virtualbox Running tcp://192.168.99.230:2376 v18.09.6
swarmWKR3 - virtualbox Running tcp://192.168.99.231:2376 v18.09.6
+ docker-machine ssh swarmMGR 'docker node ls'
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
ryplgfjntuj7rfoapbl0bb8nj * swarmMGR Ready Active Leader 18.09.6
n89x4phb9jhilwz74zgta352r swarmWKR2 Ready Active 18.09.6
sp76b5vws2fcdpjuhxcqhywh3 swarmWKR3 Ready Active 18.09.6
+ echo tcp://192.168.99.228:2376
tcp://192.168.99.228:2376
只要脚本是'active',环境变量就设置正确了。当脚本退出时,变量将被取消设置,因为 运行ning echo $DOCKER_HOST
立即从命令行产生任何结果。
随着我继续研究这个问题,我终于在 this question on AskUbuntu. It turns out the environment variables exported during the running of the script do not persist. To correct that all I needed to do was run the script using source
中找到了答案,它导致导出的环境变量一直存在,直到取消设置:
source ./create_swarm.sh
或者,使用快捷方式
. ./create_swarm.sh