我最近遇到了以下非常冗长的 docker 命令,
docker run -it -v $PWD/config:/opt/ibm/datapower/drouter/config -v $PWD/local:/opt/ibm/datapower/drouter/local -v $PWD/certs:/opt/ibm/datapower/root/secure/certs -e DATAPOWER_ACCEPT_LICENSE=true -e DATAPOWER_INTERACTIVE=true -p 9090:9090 -p 9022:22 -p 5554:5554 -p 8000-8010:8000-8010 --name idg ibmcom/datapower
有没有办法通过减少重复来缩短它?
例如,有多个-v
论点可以表达如下,
for each string in ['config', 'local', 'certs']:
-v $PWD/$$string:/opt/ibm/datapower/drouter/$$string
有没有紧凑的方法可以在 bash 或 zsh 中执行此操作(以类似于 shell 扩展的方式,而无需编写另一行)?
答案1
你试试这个:
docker run -it $(for d in config local certs; do echo -n "-v $PWD/$d:/opt/ibm/datapower/drouter/$d "; done) -e DATAPOWER_ACCEPT_LICENSE=true -e DATAPOWER_INTERACTIVE=true -p 9090:9090 -p 9022:22 -p 5554:5554 -p 8000-8010:8000-8010 --name idg ibmcom/datapower
答案2
这应该在以下情况下起作用zsh
:
docker run -it \
$(printf -- "-v $PWD/%1\$s:/opt/ibm/datapower/drouter/%1\$s " config local certs)\
-e DATAPOWER_ACCEPT_LICENSE=true -e DATAPOWER_INTERACTIVE=true \
-p 9090:9090 -p 9022:22 -p 5554:5554 -p 8000-8010:8000-8010 \
--name idg ibmcom/datapower
这使用 POSIX%$1s
参数索引printf
在输出中多次包含相同的参数(示例中为 config、local、certs)。显然bash
尚不支持此功能。
行延续(\
)只是为了使其更具可读性;它仍然可以通过一个操作进行复制和粘贴。