web-dev-qa-db-ja.com

Dockerfile:$ HOMEはADD / COPY命令で動作していません

バグを報告する前に、最近直面した奇妙なdocker build動作を確認するように誰かに依頼したいと思います。

いくつかのファイルを非ルートユーザーのホームディレクトリにコピーしようとしている単純なDockerfileがあるとします。

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

私はこのイメージを構築しようとしているときに私が得るものです:

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

$HOMEは空のようです。しかし、なぜ? $HOMEの代わりにホームディレクトリに絶対パスを置くことはあまり便利ではありません。

28
Vitaly Isaev

問題は次のとおりです。

USERディレクティブを使用すると、コンテナ内で新しいコマンドを開始するために使用されるユーザーIDに影響します。したがって、たとえば、これを行う場合:

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

あなたはこれを得る:

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

RUNコマンドはコンテナ内で新しいシェルを開始するため、前のUSERディレクティブによって変更されます。

COPYディレクティブを使用する場合、コンテナー内でプロセスを開始することはなく、Dockerにはシェルによって公開される環境変数(ある場合)を知る方法がありません。

あなたの最善の策は、ENV HOME /home/aptly Dockerfileで動作します。または、ファイルを一時的な場所にステージングしてから、

RUN cp /skeleton/myfile $HOME/myfile

また、COPYファイルをrootが所有することに注意してください。適切なユーザーに明示的にchownする必要があります。

43
larsks