【问题标题】:Weird behavior of calling docker run from bash script从 bash 脚本调用 docker run 的奇怪行为
【发布时间】:2019-09-15 16:08:03
【问题描述】:

我尝试从 bash 脚本运行 docker run 并且 docker 说: “不是 docker 命令” 如果我在调用 docker 之前打印 docker 命令行,然后将其复制到剪贴板并将其粘贴到命令行,则效果很好!

这是 bash 脚本中的命令:

local args="run ${nw_param} ${opts} --name ${img} ${repository}/${img}:${tag}"
docker ${args}

args 字符串的当前回显是:

run --net=ehvb-network -d --restart=always --name my-module my-private-registry:5000/my-module:0.0.1-1555334810

当我将此字符串复制到剪贴板并将其粘贴到命令行时,它运行良好。 我使用 Debian 拉伸。我的脚本正在使用 bash (#!/bin/bash)

当我删除 ${opts} 时,它会从 bash 中运行。 Opts 当前包含“-d --restart=always”。当我尝试仅使用 -d 或仅使用 --restart=always 时效果很好。但是当我尝试将两者一起使用时,效果并不好。 我尝试这样定义 opts:

opts=’–restart=always -d’

来自 docker 的消息是: docker:来自守护进程的错误响应:无效的重启策略“always -d”,但打印消息包含: opts:--restart=always -d

有人删除了 --restart=

【问题讨论】:

  • 嗯,我正在努力重现这一点。当您使用local 时,我假设您在函数中运行它。你能提供这个的代码吗?
  • 请注意,使用$opts 通常是不好的形式;选项列表应该存储在数组中,而不是字符串中,以避免各种细微的错误。参见BashFAQ #50我正在尝试将命令放入变量中,但复杂的情况总是失败!

标签: bash docker


【解决方案1】:

问题在于,我在脚本中使用了来自其他 bash 命令的变量(如 curl、ps 等)。所有这些变量都以回车符 \r 结尾。当我尝试将这些变量插入到 docker 参数字符串中时, \r 在其中。我需要补充: | sed 's/\r//' 到所有这些命令。

【讨论】:

  • 这在大多数操作系统上是不正确的——UNIX换行符只是\n,而不是\r\n;后者是 Windows 主义。
猜你喜欢
  • 1970-01-01
  • 2018-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 1970-01-01
相关资源
最近更新 更多