Herdar variáveis de ambiente no contêiner do Docker do systemd

9

Eu tenho um contêiner do Docker rodando systemd . Eu quero passar variáveis de ambiente para aplicativos sob ele.

Quando inicio o systemd a partir do Docker ( /sbin/init como linha de comando), o Docker expõe variáveis ao systemd, mas não expõe a serviços filhos . Se eu adicionar systemd.setenv=... ao cmdline, as variáveis serão passadas. Eu estou procurando uma solução mais limpa.

Como faço para expor as variáveis de ambiente passadas para /sbin/init para 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=1 durante a execução do meu comando.

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

Para o Dockerfile, consulte repositório do github .

    
por Motiejus Jakštys 28.07.2014 / 15:48

2 respostas

8

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

"How do I expose environment variables passed to /sbin/init to applications started by it?"

requer um pouco de irritante e uma função extremamente útil do sistema de arquivos linux / proc:

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

Isto lê / proc / 1 / envion, que é o ambiente dado ao PID 1, mas é delimitado por nulos. Ele usa 'tr' para substituir os nulos por novas linhas e, em seguida, itera essas linhas e avalia-as com uma 'exportação' prefixada, para que elas fiquem visíveis aos processos filhos.

As variáveis de ambiente não-expostas são outro "recurso" do systemd, e não o consideram um bug.

    
por 22.07.2017 / 18:14
1

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

link

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

link

    
por 21.08.2015 / 23:03