(R) Variabile de mediu în containerul R Shiny-Server: problemă și soluții

5
Introducere la All Things About bpvars, pachetul R pentru Forecasting cu atelierul Bayesian Panel Vector Autoregressions

Blogul lui Zhenguo Zhang https://fortune9.netlify.app/2026/08/15/r-environment-variables-in-r-shiny-server-container/ –

Când dockerizezi o aplicație R Shiny găzduită prin Server strălucitor (construit din imaginea strălucitoare a serverului docker https://hub.docker.com/r/rocker/shiny), o problemă comună cu care se confruntă dezvoltatorii este aceea că variabilele de mediu setate prin ENV instrucțiuni din Dockerfile (sau trecut în timpul execuției prin docker run -e) lipsesc complet în aplicația R Shiny.

De exemplu, dacă setați următoarea variabilă de mediu în dvs Dockerfile:

1
ENV SHOULD_IN_SHINY="From dockerfile"

Când aplicația dvs. se lansează și rulează Sys.getenv("SHOULD_IN_SHINY")returnează un șir gol "" în loc de "From dockerfile". Aceasta nu este o problemă cu Docker în sine, ci mai degrabă o consecință a modului Server strălucitor generează procesele R lucrător.

În această postare, vom analiza cauza principală din spatele acestui comportament în Shiny Server și vom demonstra cele două soluții recomandate pentru a expune corect variabilele de mediu lucrătorilor dvs. R Shiny.


Cauza rădăcină: modul în care serverul strălucitor generează procesele R

Motivul pentru care variabilele de mediu nu se transferă în sesiunea dvs. R constă în modul în care Shiny Server execută procesele de lucru R în interiorul containerului.

Shiny Server rulează ca un serviciu de sistem (de obicei ca root sau shiny). Când lansează o instanță de aplicație, re-execută R ca shiny utilizator neprivilegiat care utilizează su. Mai exact, apelul de execuție combină două steaguri care se exclud reciproc:

1
su shiny --login --preserve-environment -c "... R ..."

Să detaliem de la ce solicită aceste steaguri su:

  1. --login (-l): Începe a shell de conectare. Asta în mod intenționat resetează mediul într-o listă albă minimă (HOME, PATH, USER, TERMetc.) și sursele profilurilor de pornire a sistemului (/etc/profile, ~/.profile).
  2. --preserve-environment (-p): întreabă explicit su la păstrează mediul curent moștenit de la apelant (care include Docker ENV variabile).

Pentru că Linux-ul su utilitatea nu poate onora ambele comportamente conflictuale, ea alege --login și imprimă un avertisment:

1
su: ignoring --preserve-environment, it's mutually exclusive with --login

Nota: Acest avertisment este emis de apelul de execuție a procesului de bază al Shiny Server, nu de aplicația R în sine. Încercarea de a-l suprima sau de a corecta necesită modificarea și reconstruirea codului Shiny Server C++, ceea ce este rareori practic.

Pentru că shell de conectare câștigătoate variabilele de mediu personalizate au fost transmise containerului prin ENV sau docker run sunt șters înainte ca R să înceapă vreodată.


Soluții

Deoarece corecția Shiny Server nu este necesară, putem folosi punctele naturale de extensie furnizate de shell-ul de conectare sau R însuși.

Din moment ce --login determină shell-ul la sursă ~/.profile pentru shiny utilizator, putem scrie variabilele noastre de mediu /home/shiny/.profile în timpul fazei de construire a Docker.

În dumneavoastră Dockerfile:

1
2
# Append environment variable to the shiny user's profile
RUN echo 'export SHOULD_IN_SHINY="From dockerfile"' >> /home/shiny/.profile

Când se execută Shiny Server su shiny --login ...shell-ul de conectare va citi /home/shiny/.profile si incarca SHOULD_IN_SHINY în mediu chiar înainte de a începe procesul R.


Alternativ, R inspectează și încarcă automat ~/.Renviron la pornire, imediat după inițializarea mediului shell.

~/.Renviron este conceput special pentru R:

  • Se referă strict la procesele R.
  • Nu folosește coajă export cuvinte cheie sau $ expansiuni variabile.
  • Utilizează simplu KEY=value perechi cheie-valoare.

În dumneavoastră Dockerfileînființat /home/shiny/.Renviron:

1
2
3
# Set up .Renviron for the shiny user
RUN echo 'SHOULD_IN_SHINY="From dockerfile"' >> /home/shiny/.Renviron 
    && chown shiny:shiny /home/shiny/.Renviron

În aplicația dvs. Shiny (app.R sau server.R), îl puteți accesa în mod fiabil:

1
2
should_in_shiny <- Sys.getenv("SHOULD_IN_SHINY")
# Returns: "From dockerfile"

Rezumat

  • Problema: Apeluri Shiny Server su shiny --login --preserve-environmentprovocând su pentru a elimina variabilele de mediu moștenite (cum ar fi Docker ENV) în favoarea unui shell de conectare curat.
  • Soluția 1 (~/.profile): Adăugați export KEY="value" la /home/shiny/.profile în dumneavoastră Dockerfile.
  • Soluția 2 (~/.Renviron): Adăugați KEY="value" la /home/shiny/.Renviron în dumneavoastră Dockerfile.

Ambele abordări se integrează perfect cu versiunile Docker și asigură că aplicația dvs. Shiny primește în mod curat toate variabilele de configurare necesare.

– https://fortune9.netlify.app/2026/08/15/r-environment-variables-in-r-shiny-server-container/ –

NICIUN COMENTARIU

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.