根据脚本参数Bash多端口映射

时间:2017-06-01 13:37:15

标签: bash docker

我有一个接受作为参数的脚本;那么我的脚本必须根据这个参数创建一个具有多个端口映射的docker容器;例如,如果我运行。/myscript.sh 10,myscript.sh必须创建一个具有10端口映射的docker容器。

这是我的myscript.sh

#!/bin/bash

NCACHES=$1
PORT_BASE=80

docker run -idt --name CONTAINER   then..?

如果参数值是,例如,5,我想myscript会创建一个端口映射为80,81,82,83,84的容器。我怎样才能在bash脚本中管理这个条件?

参数值= 5时,它预计会有:docker run -idt --name MYNAME -p 80:80 -p 81:81 -p 82:82 -p 83:83 -p 84: 84

编辑:我已经尝试了我的剧本:

#!/bin/bash

echo $1

docker run -idt --name CONTAINER `for x in {80..$(( 80 + ${1} ))}; do printf "-p ${x}:${x} "; done` pier92/balancer:latest

但这是输出:

./mapping.sh 5
5
./mapping.sh: riga 9: printf: -p: opzione non valida
printf: uso: printf [-v var] formato [argomenti]
75899b1ec4edab51530ad8c33e955a31a45fb946ecc6eb2fa3f1ba5b5537064a
pierpaolo@pignasecca:~/Scrivania/setup-arch/webapp$ docker ps
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS              PORTS                                                                                                 NAMES
75899b1ec4ed        pier92/balancer:latest       "nginx -g 'daemon ..."   7 seconds ago       Up 4 seconds        80/tcp, 443/tcp                                                                                       CONTAINER

只映射了端口80.

3 个答案:

答案 0 :(得分:2)

您可以迭代序列:

for i in $(seq 1 $1); do 
   echo $i; 
done

将在1和输入数字参数之间循环。您可以在上面的代码中附加一个表示命令行的字符串。

请注意,您可以使用${1..5}(例如)在固定值之间扩展bash范围,但在使用范围内的变量时这不起作用。

答案 1 :(得分:2)

我宁愿使用数组并传递操作里面的内容,

portArr=()
for ((i=0;i<NCACHES;i++)); do 
    portArr+=( -p "$((PORT_BASE+i)):$((PORT_BASE+i))")
done

填充数组后,您可以通过打印验证其内容

declare -p portArr

显示每个索引的值

declare -a portArr='([0]="-p" [1]="80:80" [2]="-p" [3]="81:81" [4]="-p" [5]="82:82" [6]="-p" [7]="83:83" [8]="-p" [9]="84:84")'

现在将其作为

传递给docker命令
docker run -idt --name MYNAME "${portArr[@]}"

答案 2 :(得分:1)

这样的事情:

docker run -idt --name CONTAINER `for x in {80..$(( 80 + ${1} ))}; do printf "$x "; done`

输出类似于:

docker run -idt --name CONTAINER 80 81 82 83 84 85 86 87 88 89 90

阐释:

它只是一个打印数字序列的内联。

要在bash中执行求和,请使用此语法$(( x + y ))

编辑:

只需在printf中添加您需要显示的所有内容,在这种情况下将是:

docker run -idt --name CONTAINER `for x in $(seq 80 $(( 80 + ${1} )) ); do printf " -p ${x}:${x}"; done`

输出例如:

docker run -idt --name CONTAINER -p 80:80 -p 81:81 -p 82:82 -p 83:83 -p 84:84 -p 85:85 -p 86:86 -p 87:87 -p 88:88 -p 89:89 -p 90:90

正如Brian Agnew指出的那样,你必须使用$(seq x y)变量,谢谢!