热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Dockerfile:$HOME不能使用ADD/COPY指令

如何解决《Dockerfile:$HOME不能使用ADD/COPY指令》经验,为你挑选了1个好方法。

在提交错误之前,我想请某人确认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不是非常方便.



1> larsks..:

这是你的问题:

使用该USER指令时,它会影响用于在容器内启动新命令的用户标识.所以,例如,如果你这样做:

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

你得到这个:

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

因为这些RUN命令在容器内启动一个新的shell,它由前面的USER指令修改.

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

您最好的选择是ENV HOME /home/aptly在您的Dockerfile中设置,这将工作,或将您的文件转移到临时位置,然后:

RUN cp /skeleton/myfile $HOME/myfile

另外,请记住,当你输入COPY文件时,他们将拥有root; 您需要将chown它们明确地显示给相应的用户.


`WORKDIR/home/aptly`也有效
推荐阅读
author-avatar
pokiyo6836
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有