2016-06-25 15 views
9

Come posso far funzionare automaticamente /etc/profile quando si avvia un container di Alpine Docker in modo interattivo? Ho aggiunto alcuni alias a un file aliases.sh e l'ho inserito in /etc/profile.d, ma quando avvio il contenitore utilizzando docker run -it [my_container] sh, i miei alias non sono attivi. Devo digitare manualmente . /etc/profile dalla riga di comando ogni volta.Come ottenere/etc/profile per l'esecuzione automatica in Alpine/Docker

Esiste qualche altra configurazione necessaria per eseguire /etc/profile all'accesso? Ho anche avuto problemi con l'utilizzo di un file ~/.profile. Qualsiasi comprensione è apprezzata!

EDIT:

in base alla risposta del VonC, ho tirato e corse il suo esempio ruby contenitore. Ecco quello che ho ottenuto:

$ docker run --rm --name ruby -it codeclimate/alpine-ruby:b42 
/# more /etc/profile.d/rubygems.sh 
export PATH=$PATH:/usr/lib/ruby/gems/2.0.0/bin 
/# env 
no_proxy=*.local, 169.254/16 
HOSTNAME=6c7e93ebc5a1 
SHLVL=1 
HOME=/root 
TERM=xterm 
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 
PWD=/ 
/# exit 

Anche se il file esiste /etc/profile.d/rubygems.sh, non viene eseguito quando faccio il login e la mia variabile d'ambiente PATH non viene aggiornato. Sto usando il comando errato docker run? Manca qualcos'altro? Qualcuno ha ottenuto i file ~/.profile o /etc/profile.d/ per funzionare con Alpine su Docker? Grazie!

+0

Hai provato costruire immagini in stile alpino con 'ADD .profile/etc/.profile'? –

+2

No, non ho mai sentito parlare di usare '/ etc/.profile'. Ho sempre creduto che '.profile' appartenga alla tua directory' HOME', mentre 'profile' (no dot) appartiene a'/etc'. –

risposta

7

Si può ancora provare nella vostra Dockerfile un:

RUN echo '\ 
     . /etc/profile ; \ 
    ' >> /root/.profile 

(. Supponendo che l'utente attuale è root caso contrario, sostituire /root con il percorso a casa pieno)

Detto questo, quelli/etc /profile.d/xx.sh dovrebbe essere eseguito.
Vedi codeclimate/docker-alpine-ruby come esempio:

COPY files/

Con 'files/etc ", tra cui un files/etc/profile.d/rubygems.sh esecuzione bene


Nel OP projectDockerfile, c'è un

COPY aliases.sh /etc/profile.d/ 

Ma la. la shell predefinita è non una shell di login (sh -l), che significa profile files (or those in /etc/profile.d) are not sourced.

Aggiunta sh -l avrebbe funzionato: guscio

[email protected]:~$ docker run --rm --name ruby -it codeclimate/alpine-ruby:b42 sh -l 
87a58e26b744:/# echo $PATH 
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/ruby/gems/2.0.0/bin 
+0

VonC: Ho provato a usare anche un file '/ root/.profile', con le stesse definizioni di alias che sto inserendo nel file'/etc/profile.d/aliases.sh'. In realtà, questa è stata la prima cosa che ho provato. Ho pensato che forse c'era qualcosa di diverso con 'ash' e' sh' su Alpine che mi mancava - un motivo per cui il mio '.profile 'non veniva letto. Darò un'occhiata al tuo esempio. Grazie! –

+0

A proposito, ecco un semplice contenitore 'Node' dove sto usando il file' aliases.sh'. Forse qualcuno potrebbe estrarre questo contenitore e vedere se gli alias e il prompt dei colori funzionano correttamente quando effettuano l'accesso ... 'https: // hub.docker.com/r/jkilbride/node-npm-alpine /' –

+0

@JeffKilbride I have ho modificato la mia risposta Forse manca un chmod? – VonC

9

L'impostazione predefinita in Alpine Linux è ash.

Ash legge solo i file /etc/profile e ~/.profile se è stato avviato come shell di login sh -l.

Per forzare Ash alla fonte di /etc/profile o qualsiasi altro script che si desidera richiamare come shell non di login, è necessario impostare una variabile di ambiente denominata ENV prima di avviare Ash.

ad es.nel vostro Dockerfile

FROM alpine:3.5 

ENV ENV="/root/.ashrc" 

RUN echo "echo 'Hello, world!'" > "$ENV" 

Quando costruisci che si ottiene:

[email protected]:~/blah$ docker build --tag test . 
Sending build context to Docker daemon 2.048kB 
Step 1/3 : FROM alpine:3.5 
3.5: Pulling from library/alpine 
627beaf3eaaf: Pull complete 
Digest: sha256:58e1a1bb75db1b5a24a462dd5e2915277ea06438c3f105138f97eb53149673c4 
Status: Downloaded newer image for alpine:3.5 
---> 4a415e366388 
Step 2/3 : ENV ENV "/root/.ashrc" 
---> Running in a9b6ff7303c2 
---> 8d4af0b7839d 
Removing intermediate container a9b6ff7303c2 
Step 3/3 : RUN echo "echo 'Hello, world!'" > "$ENV" 
---> Running in 57c2fd3353f3 
---> 2cee6e034546 
Removing intermediate container 57c2fd3353f3 
Successfully built 2cee6e034546 

Infine, quando si esegue il contenitore appena generato, si ottiene:

[email protected]:~/blah$ docker run -ti test /bin/sh 
Hello, world! 
/# exit 

Avviso guscio Ash didn' t eseguire come shell di login.

Quindi, per rispondere alla vostra domanda, sostituire

ENV ENV="/root/.ashrc" 

con:

ENV ENV="/etc/profile" 

e Ash shell di Linux alpino sarà fonte automaticamente lo script/etc/profile ogni volta che viene lanciato il guscio.

Gotcha:/etc/profile normalmente è pensato per essere acquistato solo una volta! Quindi, ti consiglio di non farne il sorgente e invece di creare un file /root/.somercfile.

Fonte: https://stackoverflow.com/a/40538356

2

Come accennato da Jinesh prima, la shell di default in Alpine Linux è cenere

localhost:~$ echo $SHELL 
/bin/ash 
localhost:~$ 

Pertanto soluzione semplice è troppo aggiungere i vostri alias in .profile. In questo caso, ho messo tutti i miei alias in ~/.ash_aliases il file

localhost:~$ cat .profile 
# ~/.profile 

# Alias 
if [ -f ~/.ash_aliases ]; then 
    . ~/.ash_aliases 
fi 

localhost:~$ 

.ash_aliases

localhost:~$ cat .ash_aliases 
alias a=alias 
alias c=clear 
alias f=file 
alias g=grep 
alias l='ls -lh' 
localhost:~$ 

e funziona :)

Problemi correlati