Herdar variáveis ​​de ambiente no contêiner Systemd Docker

9

Eu tenho um contêiner do Docker executando o systemd . Eu quero passar variáveis ​​de ambiente para aplicativos nele.

Quando inicio o systemd no Docker ( /sbin/initcomo linha de comando), o Docker expõe variáveis ​​ao systemd, mas não expõe a serviços filho . Se eu adicionar systemd.setenv=...ao cmdline, as variáveis ​​serão passadas. Estou procurando uma solução mais limpa.

Como exponho variáveis ​​de ambiente passadas /sbin/initpara aplicativos iniciados por ele?

% docker run -v /sys/fs/cgroup:/sys/fs/cgroup:ro --privileged -ti \
             -e VAR1=1 motiejus/systemd_fedora20 \
             init systemd.setenv=VAR2=2
...
Welcome to Fedora 20 (Heisenbug)!
...
[  OK  ] Reached target Multi-User System.
[root@740690365eb0 ~]# env | grep VAR
VAR2=2

Espero ver VAR1=1enquanto estiver executando meu comando.

Em outras palavras, o systemd pode passar variáveis ​​passadas a ele para filhos que ele inicia?

Para o Dockerfile, consulte o repositório do github .

Motiejus Jakštys
fonte

Respostas:

9

Para responder à pergunta (como parece não ter sido respondida em nenhum outro lugar)

"Como exponho variáveis ​​de ambiente passadas para / sbin / init para aplicativos iniciados por ela?"

requer alguma festança levemente irritante e uma função extremamente útil do sistema de arquivos linux / proc:

# Import our environment variables from systemd
for e in $(tr "\000" "\n" < /proc/1/environ); do
        eval "export $e"
done

Lê / proc / 1 / envion, que é o ambiente fornecido ao PID 1, mas é delimitado por nulos. Ele usa 'tr' para substituir os nulos por novas linhas e, em seguida, itera sobre essas linhas e as avalia com uma 'exportação' precedida, para que sejam visíveis aos processos filhos.

As variáveis ​​de ambiente não expor são mais um "recurso" do systemd e não o consideram um bug.

xrobau
fonte
3
Eu quero dizer 'eu não preciso esse recurso, eu preciso de variáveis de ambiente'
Daniel Dai
2

De acordo com esta descrição, uma instância do usuário systemd não herda variáveis ​​de ambiente:

https://wiki.archlinux.org/index.php/Systemd/User#Environment_variables

Há uma sugestão aqui para usar o serviço oneshot systemd que configura um EnvironmentFile para o serviço "final".

/programming/25396167/how-do-i-get-etcd-values-into-my-systemd-service-on-coreos

janosi
fonte
1
Considere também verificar PassEnvironment=. Isso me ajudou no ambiente do docker systemd.
FelikZ