2015-03-10 8 views
15

Przed zgłoszeniem błędu chciałbym poprosić kogoś o potwierdzenie dziwnego zachowania, które ostatnio miałem przed sobą.

Rozważmy mamy proste Dockerfile gdzie staramy się skopiować niektórych plików w katalogu domowym użytkownika innego niż root:

FROM ubuntu:utopic 

ENV DEBIAN_FRONTEND=noninteractive 

RUN sed -i.bak 's/http:\/\/archive.ubuntu.com\/ubuntu\//mirror:\/\/mirrors.ubuntu.com\/mirrors.txt\//g' /etc/apt/sources.list 
RUN echo "deb http://repo.aptly.info/ squeeze main" >> /etc/apt/sources.list.d/_aptly.list 
RUN apt-key adv --keyserver keys.gnupg.net --recv-keys e083a3782a194991 
RUN apt-get update 
RUN apt-get install -y aptly 

RUN useradd -m aptly 
RUN echo aptly:aptly | chpasswd 

USER aptly 
COPY ./.aptly.conf $HOME/.aptly.conf 

COPY ./public.key $HOME/public.key 
COPY ./signing.key $HOME/signing.key 
RUN gpg --import $HOME/public.key $HOME/signing.key 

RUN aptly repo create -comment='MAILPAAS components' -distribution=utopic -component=main mailpaas 
CMD ["/usr/bin/aptly", "api", "serve"] 

To co mam, kiedy staram się budować ten obraz:

...  
    Step 10 : USER aptly 
    ---> Running in 8639f826420b 
    ---> 3242919b2976 
    Removing intermediate container 8639f826420b 
    Step 11 : COPY ./.aptly.conf $HOME/.aptly.conf 
    ---> bbda6e5b92df 
    Removing intermediate container 1313b12ca6c6 
    Step 12 : COPY ./public.key $HOME/public.key 
    ---> 9a701a78d10d 
    Removing intermediate container 3a6e40b8593a 
    Step 13 : COPY ./signing.key $HOME/signing.key 
    ---> 3d4eb847abe8 
    Removing intermediate container 5ed8cf52b810 
    Step 14 : RUN gpg --import $HOME/public.key $HOME/signing.key 
    ---> Running in 6e481ec97f74 
    gpg: directory `/home/aptly/.gnupg' created 
    gpg: new configuration file `/home/aptly/.gnupg/gpg.conf' created 
    gpg: WARNING: options in `/home/aptly/.gnupg/gpg.conf' are not yet active during this run 
    gpg: keyring `/home/aptly/.gnupg/secring.gpg' created 
    gpg: keyring `/home/aptly/.gnupg/pubring.gpg' created 
    gpg: can't open `/home/aptly/public.key': No such file or directory 
    gpg: can't open `/home/aptly/signing.key': No such file or directory 
    gpg: Total number processed: 0 

Wygląda na to, że $HOME jest pusty. Ale dlaczego? Ustawienie bezwzględnej ścieżki do katalogu domowego zamiast $HOME nie jest bardzo wygodne.

+2

Nie sądzę, że to błąd. $ HOME jest zwykle ustawiane przez powłokę, w którą wierzę i nie masz powłoki wewnątrz pliku Docker. Zawsze możesz "ENV HOME/home/aptly", a powyższe zadziała. –

Odpowiedz

21

Oto problem:

Kiedy użyć dyrektywy USER, wpływa na identyfikator użytkownika używany do uruchamiania nowych poleceń wewnątrz pojemnika. Tak więc, na przykład, jeśli to zrobić:

FROM ubuntu:utopic 
RUN useradd -m aptly 
USER aptly 
RUN echo $HOME 

Dostajesz to:

Step 4 : RUN echo $HOME 
---> Running in a5111bedf057 
/home/aptly 

Ponieważ polecenia RUN rozpoczyna nową powłokę wewnątrz kontenera, który jest modyfikowany przez poprzedniego dyrektywy USER.

Podczas korzystania z dyrektywy nie rozpoczynasz procesu wewnątrz kontenera, a Docker nie ma możliwości sprawdzenia, które (jeśli jakiekolwiek) zmienne środowiskowe zostaną ujawnione przez powłokę.

Najprościej jest albo ustawić ENV HOME /home/aptly w Dockerfile, która będzie działać, lub wystawić swoje pliki do tymczasowej lokalizacji, a następnie:

RUN cp /skeleton/myfile $HOME/myfile 

Należy również pamiętać, że jeśli COPY pliki w będą posiadane przez root; będziesz musiał jawnie je przekazać odpowiedniemu użytkownikowi.

+2

'WORKDIR/home/aptly' również działa – kev

Powiązane problemy