【问题标题】:eval $(docker-machine env myvm1) does not switch to shell to talk to myvm1eval $(docker-machine env myvm1) 不切换到 shell 与 myvm1 对话
【发布时间】:2018-07-15 19:40:18
【问题描述】:

伙计们,

我在这里关注 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。 (和edit 将结果放入问题中)。
  • 顺便说一句,一般来说,引用您的扩展是更好的形式,包括当它们将由eval 处理时。因此,eval "$(foo)",而不是eval $(foo)。差异是微妙的(在eval 的情况下),并且可能不会立即导致您的错误,但是当它们确实 引起问题时,它们......好吧......引起问题。
  • 另一件非常非常非常可能相关的事情是sudo 丢弃了未明确列入白名单的环境变量。你在这里使用它有什么原因吗?
  • @CharlesDuffy 是的 - 我还没有授予我的用户不需要 sudo 的 root 权限。我昨天试过了,但失败得很惨。

标签: linux docker zsh


【解决方案1】:

如果您在sudo 的另一侧运行eval,则出错的可能性会更少:

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

否则,evaldocker-machine env 的输出设置的环境变量不一定会传播到未来的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

【讨论】:

  • 但这不会在本地环境中设置任何环境变量吧?
  • 正确 - 它将它们设置在由 sudo 运行的命令的环境中,这是您真正需要它们的地方。
  • 哦,我明白你要做什么了。这种方法基本上需要通过sudo 在每个docker 实例化之前运行这个“之前”。但我想那个 shell 函数有助于解决这个问题!
  • 完成了 - 谢谢@CharlesDuffy!我想我明白。我确实想知道 sudo 的上下文,甚至尝试在我的 eval 前面加上 sudo 但这没有用。显然,我不会在候机楼花很多时间。我确实理解这个解决方案,并感谢大家抽出宝贵的时间。
  • 另外,该脚本看起来非常有用。再次感谢您。
【解决方案2】:

你应该运行eval $(docker-machine env myvm1) 其实不用加sudo

但是你可能没有权限在没有sudo的情况下运行docker,这里是如何在Linux上解决这个问题。


按照本文“Post-installation steps for Linux”中的步骤进行操作

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

如果您看到以下错误:

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 的需要。

    我猜我应该有 RTFM 吗?

    【讨论】:

      【解决方案4】:

      我实际上正在运行(如上,但添加了 sudo)。

      eval $(sudo docker-machine env myvm1)

      我没有从命令行得到任何输出来告诉我任何事情已经完成以及我什么时候运行:

      sudo docker-machine ls 我看到 myvm1 没有像预期的那样处于活动状态。

      运行这个命令就可以了

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-10-26
        • 2015-08-13
        • 2016-07-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-05
        相关资源
        最近更新 更多