Dockerfile:$HOME未使用添加/复制指令

Dockerfile:$HOME未使用添加/复制指令,docker,dockerfile,Docker,Dockerfile,在提交bug之前,我想请某人确认我最近遇到的奇怪的docker build行为 假设我们有一个简单的Dockerfile,其中我们试图将一些文件复制到非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' /

在提交bug之前,我想请某人确认我最近遇到的奇怪的
docker build
行为

假设我们有一个简单的Dockerfile,其中我们试图将一些文件复制到非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"]
这就是我在尝试构建此图像时得到的结果:

    ...    
    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 dir而不是
$home
不是很方便。

这是您的问题:

当您使用
USER
指令时,它会影响用于在容器内启动新命令的userid。例如,如果您这样做:

FROM ubuntu:utopic
RUN useradd -m aptly
USER aptly
RUN echo $HOME
你得到这个:

Step 4 : RUN echo $HOME
 ---> Running in a5111bedf057
/home/aptly
因为
RUN
命令在容器内启动一个新的shell,该shell由前面的
USER
指令修改

当您使用
COPY
指令时,您不是在容器内启动进程,Docker无法知道shell将公开哪些(如果有的话)环境变量

您的最佳选择是在Dockerfile中设置
ENV HOME/HOME/适当地设置
,这将起作用,或者将文件暂存到临时位置,然后:

RUN cp /skeleton/myfile $HOME/myfile

另外,请记住,当您
在中复制
文件时,这些文件将归
根目录下的
所有;您需要显式地
chown
将它们发送给相应的用户。

您需要使用绝对路径。

对于
用户,
仅适用于
运行
命令
入口点

USER
指令设置运行映像时要使用的用户名(或UID)和可选的用户组(或GID),以及Dockerfile中的任何
RUN
CMD
入口点
指令


我不认为这是一个错误$主页通常由shell设置,我相信Dockerfile中没有shell。您可以始终
ENV HOME/HOME/aply
,然后上述操作就可以了。谢谢您的帮助!
ENV
的单独重新定义保存了我的屁股!如果使用docker Composite构建,那么即使是绝对路径也可能与docker-compose.yml中的上下文相关。这实际上是我必须做的。