Bash eval$(docker machine env)似乎在shell脚本中工作,但立即失败

Bash eval$(docker machine env)似乎在shell脚本中工作,但立即失败,bash,docker,docker-compose,eval,docker-machine,Bash,Docker,Docker Compose,Eval,Docker Machine,使用Docker Desktop 2.0.5.0在macOS High Sierra上为Docker设置大量虚拟机,但这在过去的版本中已经发生。我运行以下shell脚本: #!/bin/bash # some variables MANAGER="swarmMGR" WORKER="swarmWKR" MAXNODE=3 # create VMs for swarm # manager docker-machine create --driver vi

使用Docker Desktop 2.0.5.0在macOS High Sierra上为Docker设置大量虚拟机,但这在过去的版本中已经发生。我运行以下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"
如果我执行一个简单的命令,比如docker node ls,它现在应该在swarm manager上运行,我会得到以下错误:

来自守护程序的错误响应:此节点不是swarm manager。使用docker swarm init或docker swarm join将此节点连接到swarm,然后重试

如果我手动运行eval命令,响应将变得正确。我做了很多研究,找不到解决这个问题的办法

在从脚本运行eval命令时,是否必须执行某些操作才能使其正常工作

补充资料 我使用-x选项运行了有问题的shell脚本部分,以输出一些调试信息:

#!/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

只要脚本处于“活动”状态,就可以正确设置环境变量。当脚本退出时,变量将被取消设置,因为随后从命令行运行echo$DOCKER\u HOST不会产生任何结果。

当我继续研究这个问题时,我终于在AskUbuntu中找到了答案。事实证明,在脚本运行期间导出的环境变量不会持久化。要纠正这一点,我需要做的就是运行脚本,使用该脚本将导致导出的环境变量一直保持到未设置:

source ./create_swarm.sh
或者,使用快捷方式

. ./create_swarm.sh
. ./create_swarm.sh