wake-up-neo.com

Dockerfile: $ HOME funktioniert nicht mit ADD / COPY-Anweisungen

Bevor ich einen Fehler melde, möchte ich jemanden bitten, das seltsame docker build - Verhalten zu bestätigen, mit dem ich kürzlich konfrontiert war.

Stellen Sie sich vor, wir haben eine einfache Docker-Datei, in die wir versuchen, einige Dateien in das Home-Verzeichnis eines Nicht-Root-Benutzers 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 bekomme ich, wenn ich versuche, dieses Image zu erstellen:

    ...    
    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, als wäre $HOME Leer. Aber wieso? Es ist nicht sehr praktisch, den absoluten Pfad zum Ausgangsverzeichnis anstelle von $HOME Anzugeben.

28
Vitaly Isaev

Hier ist dein Problem:

Wenn Sie die Direktive USER verwenden, wirkt sich dies auf die Benutzer-ID aus, die zum Starten neuer Befehle im Container verwendet wird. Wenn Sie dies zum Beispiel tun:

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

Du bekommst das:

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

Weil der Befehl RUN eine neue Shell in einem Container startet, die von der vorhergehenden Anweisung USER geändert wird.

Wenn Sie die Direktive COPY verwenden, starten Sie keinen Prozess innerhalb des Containers, und Docker weiß nicht, welche Umgebungsvariablen (falls vorhanden) von einer Shell verfügbar gemacht werden.

Am besten setzen Sie entweder ENV HOME /home/aptly in Ihrer Docker-Datei, die funktioniert, oder stellen Sie Ihre Dateien an einem temporären Speicherort bereit, und dann:

RUN cp /skeleton/myfile $HOME/myfile

Denken Sie auch daran, dass wenn Sie COPY Dateien in sich haben, diese im Besitz von root sind. Sie müssen sie dem entsprechenden Benutzer explizit chown mitteilen.

43
larsks