首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在容器中计算bash $variable的"docker“命令

在容器中计算bash $variable的"docker“命令
EN

Stack Overflow用户
提问于 2018-02-15 16:41:58
回答 2查看 4.8K关注 0票数 5

如何使用docker run在docker容器中运行命令,其中bash变量在容器中进行计算?

例如:

代码语言:javascript
复制
$ SOMEONE=host
$ docker run --env SOMEONE=busybox busybox echo "Hello $SOMEONE"
Hello host

如何使它输出Hello busybox

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-15 16:45:25

  • 为了防止从外壳发生替换,需要使用单引号,而不是双引号。
  • 为了确保有一个内核外壳可以进行替换(echo本身没有任何这样的功能!),我们需要显式地调用sh -c;否则,Docker将直接在容器中调用execlp("echo", "echo", "$SOMEONE", NUL),而容器实际上不会进行任何替换。

因此:

代码语言:javascript
复制
docker run --env SOMEONE=busybox busybox sh -c 'echo "Hello $SOMEONE"'
票数 12
EN

Stack Overflow用户

发布于 2022-03-30 15:18:01

使用docker run,其中bash变量在其中计算。

下面是我的想法--我在主机上编写了一个脚本,它声明了一个函数,其中包含要在容器中执行的所有命令。通过这种方式,您可以像平时一样更容易地编辑脚本,避免使用特殊的引号位置和转义。此外,我们还可以调试命令,并查看bash在容器中实际做了什么。

下面是一个在Server上运行命令的示例,该命令运行在docker容器中。

代码语言:javascript
复制
-- (host) $ ./create-db.sh
#!/bin/bash

function main_inside_docker {
  DBNAME=${1:-testdb}
  echo "creating database $DBNAME"
  PATH=$MSSQL_PATH:$PATH
  SQL="
  create database $DBNAME;
  select database_id, name, create_date from sys.databases;
  "
  sqlcmd -U SA -P $SA_PASSWORD -Q "$SQL"
}

CMD="$(declare -f main_inside_docker); main_inside_docker $@"
docker exec -it mssql bash -c "$CMD"

本质上,这会将函数定义复制到容器内的bash,然后使用主机调用提供的所有参数运行函数定义。函数中的所有变量都在docker容器中展开。

要调试函数,请将"-x“设置为$CMD中的第一个命令

代码语言:javascript
复制
CMD="set -x; $(declare -f ...)"

以这种方式运行它时,它将很好地从容器内部打印bash跟踪:

代码语言:javascript
复制
(host) $ ./create-db.sh foodb
+ main_inside_docker
+ DBNAME=foodb
+ echo 'creating database foodb'
creating database testdb
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48812216

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档