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