2015-03-10 5 views
15

Bevor ich einen Fehler einreiche, möchte ich jemanden bitten, das merkwürdige docker build Verhalten zu bestätigen, mit dem ich kürzlich konfrontiert wurde.

Betrachten wir ein einfaches Dockerfile haben, wo wir versuchen, einige Dateien in Verzeichnis eines Nicht-Root-Benutzer zu kopieren:

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"] 

Das ist, was ich bekomme, wenn ich dieses Bild zu bauen bin versucht:

...  
    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 

Scheint wie $HOME ist leer. Aber warum? Den absoluten Pfad zum Home-Verzeichnis anstelle von $HOME zu setzen, ist nicht sehr praktisch.

+2

Ich glaube nicht, dass dies ein Fehler ist. $ HOME wird normalerweise von der Shell festgelegt, die ich glaube, und Sie haben keine Shell in einer Dockerfile. Sie können immer "ENV HOME/home/aptly" und dann würde das oben genannte funktionieren. –

Antwort

21

Hier ist Ihr Problem:

Wenn Sie die USER Richtlinie verwenden, ist es die Benutzer-ID wirkt verwendet, um neue Befehle im Inneren des Behälters zu starten. So zum Beispiel, wenn Sie dies tun:

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

Sie diese:

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

Da die RUN Befehle eine neue Shell in einem Container beginnt, die durch die vorangehenden USER Richtlinie geändert wird.

Wenn Sie die COPY-Direktive verwenden, starten Sie keinen Prozess innerhalb des Containers, und Docker kann nicht wissen, welche (wenn überhaupt) Umgebungsvariablen von einer Shell verfügbar gemacht werden.

Ihre beste Wette ist entweder festgelegt ENV HOME /home/aptly in Ihrem Dockerfile, was funktionieren wird, oder Ihre Dateien in einem temporären Speicherort Bühne und dann:

RUN cp /skeleton/myfile $HOME/myfile 

Denken Sie auch daran, dass, wenn Sie COPY Dateien in sie werden im Besitz von root; Sie müssen explizit chown sie an den entsprechenden Benutzer.

+2

'WORKDIR/home/aptly' funktioniert auch – kev

Verwandte Themen