【问题标题】:How to write docker command with /bin/sh and assign result to variable?如何使用 /bin/sh 编写 docker 命令并将结果分配给变量?
【发布时间】:2020-11-20 08:23:46
【问题描述】:

我正在尝试编写一个应该启动 docker 容器的 shell 脚本。 我有一个正在运行的示例,但它使用 /bin/bash:

#!/bin/bash

export NETWORK=jetty-svc-test
export IMAGE_TAG=jetty-test-app
export SVC_NAME=svc-test

clean_up() {
    docker stop $SVC_NAME
    docker network rm $NETWORK
}

docker network create $NETWORK
if [ $? -eq 1 ]; then
    exit 1
fi

docker build --tag $IMAGE_TAG .
if [ $? -eq 1 ]; then
    exit 1
fi

docker run -it --rm --name $SVC_NAME --network=$NETWORK -v $(pwd)/app:/app -d $IMAGE_TAG
if [ $? -eq 1 ]; then
    exit 1
fi
sleep 5

export RES=$(docker run --rm --network=$NETWORK curlimages/curl:7.71.1 http://$SVC_NAME:8080 | docker run --rm -i stedolan/jq .)
export HEALTH_CHECK=$(echo "$RES" | docker run --rm -i stedolan/jq -r .status)

if [ "$HEALTH_CHECK" != "I am healthy" ]; then
    clean_up
    exit 1
fi

clean_up

但我需要它在#!/bin/sh。例如,export RES=$(.. 语句在 #!/bin/sh 中不起作用。

我需要重写上面的脚本,因为https://hub.docker.com/layers/docker/library/docker/19.03.12/images/sha256-d208a88b6afa09430a2f4becbc8dbe10bfdaeb1703f9ff3707ca96e89358a8e4?context=explore只支持#!/bin/sh,我想在docker:dind容器中运行上面的脚本。

如何使用 /bin/sh 编写 docker 命令并将结果分配给变量?

【问题讨论】:

  • 不是/bin/sh 通常符号链接到bash(或dash 在基于debian 的系统上,或zsh 在macos 上)
  • 我已经重写了我的帖子。
  • export RES=$(.. does not work in #!/bin/sh? “不工作”是什么意思?请首先使用 shellcheck.net 检查您的脚本 if [ $? -eq 1 ]; then 是反模式,请执行 if ! command args args args; then
  • 您也可以尝试使用反引号:FOO=`docker run ...`
  • @jakub 你不是在回答你自己的问题吗? /bin/sh 通常与 something 符号链接,但 something 是一个移动的目标。 dash 非常接近于基本的 POSIX shzsh 是一个完全独立的蠕虫罐(尽管它可以设置为模拟 bashsh)。

标签: bash docker shell sh


【解决方案1】:

你似乎在问如何重写

export variable=$(command)
export other="value"

POSIX sh 的答案很简单

variable=$(command)
export variable

other="value"
export other

另见Where is “export var=value” not available? (on Unix / Linux Stack Exchange)

【讨论】:

【解决方案2】:

正如评论中提到的,你可以再次检查脚本shellcheck,我不会在 shell 脚本中解决这个问题,因为评论中的建议应该有效,但我只是通过扩展来创建自定义图像docker:dind,它将具有 bash 以及您正在尝试为 jq 等拉取 docker 映像的其他实用程序,

通过这种方法,您将节省网络带宽和 CPU 时间。

FROM docker:dind
RUN apk add --no-cache bash jq curl

现在运行这个docker:dind 图像而不是官方图像,你的脚本会变成这样

docker run -dit --rm --name $SVC_NAME -p 3000:3000 --network=$NETWORK  jetty-test-app:latest
if [ $? -eq 1 ]; then
    exit 1
fi
sleep 2

RES=$(curl localhost:3000/users | jq .)

export HEALTH_CHECK=$(echo "$RES" | jq .status)

if [ "$HEALTH_CHECK" != "I am healthy" ]; then
    clean_up
    exit 1
fi
clean_up

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-20
    • 1970-01-01
    • 2011-01-23
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-01
    相关资源
    最近更新 更多