Можете ли вы попробовать использовать следующий формат для создания:
docker run -it --mount type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH> --mount type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH> -p host_port:container_port --name myservice <IMAGE>
Редактировать:Команда создания была отредактирована
Вышеизложенное сработало для меня:
docker run -ti --mount type=volume,src=cust_vol2,dst=/cust_vol2 --mount type=volume,src=cust_vol1,dst=/cust_vol1 -p 8024:8024 --name mycontainer centos
$docker inspect mycontainer
"Mounts": [
{
"Type": "volume",
"Source": "cust_vol2",
"Target": "/cust_vol2"
},
{
"Type": "volume",
"Source": "cust_vol1",
"Target": "/cust_vol1"
}
]
и предоставить подробный вывод, если это возможно.
Я думаю, вы хотите проверить бла внутри цикла for. Нет необходимости в переменной tmpcheck. Вместо этого вы можете использовать $restartrsyslog
для перезапуска rsyslog только один раз :
files=(
'/etc/rsyslog.conf'
'/etc/rsyslog.d/remote.conf'
'/etc/rsyslog.d/01-remote.conf'
)
restartrsyslog=
for f in "${files[@]}";do
if grep -q blah "$f"; then
echo -e "Removing blah from $f"
sed -i "/blah/d" "$f"
restartrsyslog=yes
else
echo -e "Nothing to do, blah has been removed from $f"
fi
done
if [[ -n $restartrsyslog ]] ; then
echo -e "Restarting rsyslog service"
systemctl restart rsyslog.service
fi
Ваша переменная tmpcheck
устанавливается на команду, а не на результат этой команды, она никогда не будет равна 1, поэтому выражение всегда будет оцениваться как истинное. Вы должны использовать конструкцию $(... )
для замены вывода команд. Вам также не нужно зацикливаться на файлах, но если вы это сделаете, вам не следует использовать ${files[*]}
, а вместо этого используйте ${files[@]}
. Кроме того, нет необходимости cat
передавать один файл и передавать в grep
, поскольку grep
может читать файлы, и нет необходимости передавать grep
в wc -l
, поскольку grep
имеет параметр -c
. для подсчета результатов. Наконец, почему вы проверяете, что tmpcheck
не равно 1? Что, если оно равно 2 или больше?
Вам это подходит?
#!/bin/bash
files=(
'/etc/rsyslog.conf'
'/etc/rsyslog.d/remote.conf'
'/etc/rsyslog.d/01-remote.conf'
)
tmpcheck=$(cat "${files[@]}" | grep -c blah)
if (($tmpcheck>=1)); then
for f in "${files[@]}";do
echo -e "Removing blah from $f"
sed -i "/blah/d" "$f"
done
echo -e "Restarting rsyslog service"
systemctl restart rsyslog.service
else
echo -e "Nothing to do, blah has been removed from $f"
fi
Основная проблема в вашем коде (назначениеtmpcheck
)было указано в других ответах. Здесь немного другой подход, предполагающий, что распечатка имен модифицированных/немодифицированных файлов не является обязательной:
if grep -q -- blah "${files[@]}"
then
sed -i -e '/blah/d' -- "${files[@]}"
systemctl restart rsyslog.service
else
printf '%s\n' 'Nothing to do'
fi
Основные идеи здесь:
grep
)статус выхода команды в составных командах if
вместо того, чтобы сохранять ее вывод и тестировать его позже, если это не необходимо; Кроме того, пока это не проблемы в коде, который вы показываете:
--
)защищает от необычных имен файлов; printf
безопаснее , чем echo
, особенно при печати результатов расширений.