Dockerfile:$ HOME不适用于ADD / COPY指令

在提交错误之前,我想请某人确认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目录而不是$HOME不是很方便。

回答:

这是您的问题:

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

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它们明确地提供给适当的用户。

以上是 Dockerfile:$ HOME不适用于ADD / COPY指令 的全部内容, 来源链接: utcz.com/qa/422895.html

回到顶部