2016-06-25 12 views
9

Jak mogę automatycznie uruchomić /etc/profile podczas interaktywnego uruchamiania kontenera Alpine Docker? Dodałem kilka aliasów do pliku aliases.sh i umieściłem go w /etc/profile.d, ale kiedy uruchamiam kontener przy użyciu docker run -it [my_container] sh, moje aliasy są nieaktywne. Muszę ręcznie wpisać . /etc/profile z wiersza poleceń za każdym razem.Jak uzyskać automatyczne uruchamianie/etc/profile w Alpine/Docker

Czy istnieje inna konfiguracja niezbędna do uruchomienia /etc/profile przy logowaniu? Miałem także problemy z używaniem pliku ~/.profile. Wszelkie docenianie jest doceniane!

EDIT:

podstawie odpowiedzi VonC za, wyciągnąłem i prowadził jego przykład ruby pojemnik. Oto co mam:

$ 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 

Chociaż plik /etc/profile.d/rubygems.sh istnieje, to nie jest uruchamiany, kiedy zalogować się i moja zmienna PATH nie jest aktualizowany. Czy używam złego polecenia docker run? Czy czegoś jeszcze brakuje? Czy ktoś uzyskał ~/.profile lub /etc/profile.d/ pliki do pracy z Alpine w Docker? Dzięki!

+0

Czy spróbować zbudować Alpine Obrazy z ADD '.profile/etc/.profile'? –

+2

Nie, nigdy nie słyszałem o próbie użycia '/ etc/.profile'. Zawsze uważałem, że '.profile' należy do katalogu' HOME', natomiast 'profil' (bez kropek) należy do'/etc'. –

Odpowiedz

7

nadal można spróbować w Dockerfile a:

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

(. Zakładając, że bieżący użytkownik jest root Jeśli nie, wymień /root z pełnej ścieżki głównej)

Mając na uwadze powyższe, ci/etc /profile.d/xx.sh powinien działać.
Zobacz codeclimate/docker-alpine-ruby jako przykład:

COPY files/

Z 'files/etc "łącznie z files/etc/profile.d/rubygems.sh działa dobrze


W OP projectDockerfile, istnieje

COPY aliases.sh /etc/profile.d/ 

Ale. domyślna powłoka to , a nie powłoka logowania (sh -l), co oznacza profile files (or those in /etc/profile.d) are not sourced.

Dodawanie sh -l będzie działać:

[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: Próbowałem również użyć pliku '/ root/.profile' z tymi samymi definicjami aliasów, które umieszczam w pliku'/etc/profile.d/aliases.sh'. Właściwie to była pierwsza rzecz, którą próbowałem. Pomyślałem, że być może było coś innego z 'ash' i' sh' na Alpine, czego mi brakowało - z jakiegoś powodu mój '.profile' nie był czytany. Rzucę okiem na twój przykład. Dzięki! –

+0

Nawiasem mówiąc, oto podstawowy kontener 'Node', w którym używam pliku' aliases.sh'. Może ktoś mógłby wyciągnąć ten kontener i sprawdzić, czy aliasy i znak zachęty kolorów działają poprawnie podczas logowania ... https: // hub.docker.com/r/jkilbride/node-npm-alpine/' –

+0

@JeffKilbride Mam zredagowałem moją odpowiedź. Może brakuje chmod? – VonC

9

Domyślna powłoka w Alpine Linux jest ash.

Popiół odczyta tylko pliki /etc/profile i ~/.profile, jeśli jest uruchomiony jako powłoka logowania sh -l.

Aby zmusić Asha do pozyskania /etc/profile lub dowolnego innego skryptu po jego wywołaniu jako powłoki niezalogowanej, przed uruchomieniem Ash musisz ustawić zmienną środowiskową o nazwie ENV.

np.w Dockerfile

FROM alpine:3.5 

ENV ENV="/root/.ashrc" 

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

Podczas tworzenia że masz:

[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 

Wreszcie, po uruchomieniu nowo wygenerowanego pojemnik dostaniesz:

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

Wskazówka powłoka Ash nie zrobił” t działa jako powłoka logowania.

Więc odpowiedzieć na zapytanie, należy wymienić

ENV ENV="/root/.ashrc" 

z:

ENV ENV="/etc/profile" 

i Ash shell Alpine Linux będzie automatycznie źródła skryptu/etc/profile każdym razem, gdy powłoka jest uruchomiona.

Gotcha:/etc/profile jest zwykle przeznaczony tylko do jednego źródła! Tak więc, radziłbym, abyś go nie pozyskał i zamiast tego zamiast niego użył /root/.somercfile.

Źródło: https://stackoverflow.com/a/40538356

2

Jak wspomniano przez Jinesh przed domyślna powłoka w Alpine Linux jest popiół

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

Dlatego prostym rozwiązaniem jest też dodać aliasy w .profile. W tym przypadku, mogę umieścić wszystkie moje aliasy w ~/.ash_aliases

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

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

localhost:~$ 

.ash_aliases złożyć

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

I to działa :)

Powiązane problemy