
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:
--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).--preserve-environment(-p): întreabă explicitsula păstrează mediul curent moștenit de la apelant (care include DockerENVvariabile).
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.
Soluția 1: Utilizați ~/.profile (Recomandat pentru variantele Shell la nivel de utilizator)
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.
Soluția 2: Utilizați ~/.Renviron (Recomandat pentru configurații specifice 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ă
exportcuvinte cheie sau$expansiuni variabile. - Utilizează simplu
KEY=valueperechi 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ândsupentru a elimina variabilele de mediu moștenite (cum ar fi DockerENV) în favoarea unui shell de conectare curat. - Soluția 1 (
~/.profile): Adăugațiexport KEY="value"la/home/shiny/.profileîn dumneavoastrăDockerfile. - Soluția 2 (
~/.Renviron): AdăugațiKEY="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/ –