eval $(docker-machine env myvm1)不能切换到与myvm1通信的shell

8

大家好,

我正在按照这里的Docker教程操作:https://docs.docker.com/get-started/part4/#configure-a-docker-machine-shell-to-the-swarm-manager 在运行以下命令时遇到了问题:

eval $(docker-machine env myvm1)

我实际上正在运行(与上述相同,但添加了sudo命令)。

eval $(sudo docker-machine env myvm1)

我无法从命令行中获得任何输出告诉我是否已经完成操作,当我运行以下命令时:

sudo docker-machine ls

我发现我的 myvm1 没有像预期一样激活。我知道这一步并非必要,但我想了解为什么命令不起作用并尝试修复它。
我正在运行 docker 17.09.0-ce 在 Ubuntu 16.04 LTS 上
zsh shell(已尝试切换到 bash)
顺便说一下,这只是在我的本地机器上,而不是服务器。
非常感谢您的任何帮助。

如果你想看到正在执行的操作,请先运行 set -x 命令。(然后将其结果编辑到问题中)。 - Charles Duffy
顺便提一下,通常最好引用您的扩展,包括当它们将被eval处理时。因此,应该使用eval "$(foo)"而不是eval $(foo)。差异微妙(在eval情况下),可能不会导致您立即出现错误,但当它们确实导致问题时,它们...嗯...会导致问题。 - Charles Duffy
另一个非常,非常相关的事情是,sudo 会丢弃未明确列入白名单的环境变量。你在这里使用它有什么原因吗? - Charles Duffy
@CharlesDuffy 是的 - 我还没有给我的用户root权限,所以需要sudo。我昨天尝试过了,但失败了。 - Andrew Tanner
4个回答

9

如果在sudo的远端运行eval,则出错的可能性会减少。

sudo sh -c 'eval "$(docker-machine env myvm1)"; docker-machine ls'

否则,通过执行 docker-machine env 的输出进行 eval 设置的环境变量不一定会在将来的 docker-machine 调用中传播(除非进行了某些特定的 /etc/sudoers 配置)。
如果您想要使用一个 shell 函数来自动化这个过程,是可行的:
# docker-env sudo; usage: desudo vm-name command-to-run
desudo() {
  local cmd1 cmd2
  printf -v cmd1 'eval "$(docker-machine env %q)"' "$1"; shift
  printf -v cmd2 '%q ' "$@"
  sudo bash -c "${cmd1} && exec ${cmd2}"
}

...可以用作:

desudo vm1 docker-machine ls

1
但这不会在本地环境中设置任何环境变量,对吧? - Oliver Charlesworth
1
正确 -- 它将它们设置在由 sudo 运行的命令的环境中,这正是您实际需要它们的地方。 - Charles Duffy
哦,我明白你的意思了。这种方法基本上需要在每个 docker 实例化之前通过 sudo 运行它。但是那个 shell 函数可以帮助解决这个问题! - Oliver Charlesworth
搞定了 - 感谢 @CharlesDuffy!我想我明白了。我确实想知道sudo的上下文,甚至尝试在我的eval前面加上sudo,但那行不通。显然我在终端里花费的时间不多。我理解这个解决方案,并感谢你们抽出时间来帮助我。 - Andrew Tanner
此外,那个脚本看起来非常有用。再次感谢您。 - Andrew Tanner

5

你应该运行eval $(docker-machine env myvm1). 实际上,你不需要添加sudo

但是,在Linux系统中,你可能没有权限在没有sudo的情况下运行docker命令。以下是解决此问题的方法:


按照这篇文章 "Linux后安装步骤" 的步骤执行:

  1. 创建docker用户组。sudo groupadd docker
  2. 将你的用户添加到docker用户组中。sudo usermod -aG docker $USER
  3. 退出并重新登录系统,以便重新评估你的组成员身份。
  4. 验证是否可以在没有sudo的情况下运行docker命令。docker run hello-world

如果你看到以下错误信息:

WARNING: Error loading config file: /home/user/.docker/config.json -
stat /home/user/.docker/config.json: permission denied

以下是修复方法:

$ sudo chown "$USER":"$USER" /home/"$USER"/.docker -R
$ sudo chmod g+rwx "/home/$USER/.docker" -R

3

我也遇到了与发布的问题完全相同的问题,并花费了大部分早晨搜索答案。我回顾了文档,并意识到我完全忽略了Linux的后安装步骤。

https://docs.docker.com/install/linux/linux-postinstall/

我按照标记为以非root用户身份管理Docker的部分中的说明进行操作,运行了eval $(sudo docker-machine env myvm1),然后后续的docker-machine ls如预期一样工作。此外... 它消除了在所有docker命令前加上sudo的需要。
我想我应该阅读文档吗?

0

我实际上正在运行(与上面相同但添加了sudo)。

eval $(sudo docker-machine env myvm1)

我没有从命令行获得任何输出告诉我已经完成了什么,当我运行:

sudo docker-machine ls 我看到myvm1没有预期的活动状态。

运行此命令即可:

sudo sh -c 'eval "$(docker-machine env myvm1)"; docker-machine ls'


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接