Это работает для меня. Суть в том, чтобы добавить User
в Service
, а также инициировать DISPLAY
в Environment
.
[Unit]
Description=launch chromium
[Service]
User=<user>
Environment=DISPLAY=:0
ExecStart=/usr/bin/chromium-browser
[Install]
WantedBy=user@.service
Чтобы интерпретатор оценивал шелл-код, хранящийся в переменной, вы должны использовать специальную встроенную команду eval
. То же, что и в некоторых других языках :
cmd="--name=cloudflare-ddns \
--hostname=oznu-cloudflare-ddns \
--env=SUBDOMAIN=private \
--env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin \
--env=QEMU_ARCH=x86_64 \
--env=S6_KEEP_ENV=1 \
--env=S6_BEHAVIOUR_IF_STAGE2_FAILS=2 \
--env=CF_API=https://api.cloudflare.com/client/v4 \
--env=RRTYPE=A
--env='CRON=*/5 * * * *' --env=PROXIED=false \
--env=ZONE=thebiermans.net \
--env=API_KEY=kka \
--network=host \
--restart=always \
--log-driver=db --runtime=runc --detach=true -t oznu/cloudflare-ddns:latest"
eval "docker run $cmd"
Это предполагает конкатенацию "docker run "
и содержимого $CMD
в виде допустимого кода в синтаксисе оболочки. В этом случае интерпретация этого кода приведет к выполнению команды docker
со списком аргументов.
Чтобы запустить команду со списком аргументов, хранящихся в переменной, вы должны использовать переменную-массив:
args=(
--name=cloudflare-ddns
--hostname=oznu-cloudflare-ddns
--env=SUBDOMAIN=private
--env=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
--env=QEMU_ARCH=x86_64
--env=S6_KEEP_ENV=1
--env=S6_BEHAVIOUR_IF_STAGE2_FAILS=2
--env=CF_API=https://api.cloudflare.com/client/v4
--env=RRTYPE=A
--env='CRON=*/5 * * * *'
--env=PROXIED=false
--env=ZONE=thebiermans.net
--env=API_KEY=kka
--network=host
--restart=always
--log-driver=db --runtime=runc --detach=true
-t oznu/cloudflare-ddns:latest
)
docker run "${args[@]}"
В любом случае, в bash не оставляйте расширения параметров без кавычек в контексте списка, так как это вряд ли когда-либо делает то, что вы хотите. Это делает оператор split+glob, который разбивает содержимое переменной на символы $IFS
, а затем выполняет генерацию имени файла для каждого полученного слова. Это совершенно не связано с токенизацией синтаксиса оболочки и разбором синтаксиса, которые являются частями, которые, например, распознают и интерпретируют кавычки.