Dockerfile: $HOME ne fonctionne pas avec les instructions ADD/COPY

avant de déposer un bug je voudrais demander à quelqu'un de confirmer le bizarre docker build comportement auquel j'ai récemment fait face.

Considérons que nous avons un simple Dockerfile où nous essayons de copier certains fichiers dans le répertoire home de l'utilisateur non-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"]

c'est ce Que j'obtiens quand j'essaie de construire cette image:

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

Semble $HOME est vide. Mais pourquoi? Mettre le chemin absolu à la maison dir au lieu de $HOME n'est pas très pratique.

18
demandé sur Vitaly Isaev 2015-03-10 17:20:56

1 réponses

Voici votre problème:

Lorsque vous utilisez le USER directive, elle affecte l'userid utilisé pour lancer de nouvelles commandes à l'intérieur du conteneur. Ainsi, par exemple, si vous faites cela:

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

Vous obtenez ceci:

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

parce que le RUN commandes démarre une nouvelle coque à l'intérieur d'un conteneur, qui est modifié par le précédent USER la directive.

Lorsque vous utilisez le COPY directive, vous ne démarrez pas un processus à l'intérieur du conteneur, et Docker n'a aucun moyen de savoir quelles variables d'environnement (le cas échéant) seraient exposées par un shell.

Votre meilleur pari est de définir ENV HOME /home/aptly dans votre Dockerfile qui va travailler, ou de en scène vos fichiers dans un emplacement temporaire, et ensuite:

RUN cp /skeleton/myfile $HOME/myfile

aussi, rappelez-vous que lorsque vous COPY fichiers, ils seront détenus par root; vous devrez explicitement chown à l'utilisateur approprié.

27
répondu larsks 2015-03-10 15:39:57