当前位置: 首页 > 面试题库 >

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

司徒阳曜
2023-03-14
问题内容

在提交错误之前,我想请某人确认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内将文件复制到映像中(如果存在),pip的requirements.txt文件似乎是一个不错的选择,但是如何实现呢? 要么 问题答案: 目前尚不支持此功能(因为我怀疑它会导致图像无法复制,因为相同的Dockerfile会根据文件的存在来复制或不复制该文件)。 在问题13045中,仍要求使用通配符“ ”(2015年5月)。 目前(2015年7月)不会在Docke

  • 问题内容: 所有人,我正在尝试将文件从主机持久复制到映像,以便基于该映像启动的每个容器都可以使用这些文件。在debian wheezy 64bit上以virtualbox guest身份运行。 Dockerfile非常简单(安装八度映像): 发出构建命令后,我得到以下跟踪: Docker绝对拒绝将此文件从主机复制到映像中。不用说文件loadjson.m存在(猫显示),我所有更改路径(相对,绝对等)

  • 当我试图用Dockerfile构建自己的docker图像时,我发现在使用添加或复制命令后,文件没有复制到我的图像中。 为了测试ADD命令,我创建了一个简单的dockerfile,如下所示: 我的文件结构很简单,如下所示: 当我使用docker build命令构建图像时,过程如下: 该过程以cat命令未找到测试结束。我用dockerfile脚本将txt添加到图像中。 这让我很困惑,我在不同的环境下尝

  • 我将Java14与Jetty 9.4和Weld-Servlet-Shaded-3.1一起使用,并得到以下异常: 根据这里的答案:https://stackoverflow.com/a/41265267/5057736我试图添加 和 但没人帮忙。有人能说怎么修吗? 启动应用程序 这是堆栈跟踪 编辑4 我发现不同的行为发生,因为焊接。这是来自ClassFileUtils的文章:

  • 问题内容: Dockerfile中的和命令之间有什么区别,何时可以在另一个之上使用? COPY指令将从以下位置复制新文件并将其添加到容器的文件系统中: ADD指令将从中复制新文件并将其添加到位于path的容器的文件系统中。 问题答案: 您应该查看和文档以获取有关其行为的更详细描述,但简而言之,主要区别在于可以做的还不止: 允许成为网址 参考下面的评论, 文档指出: 如果是以公认的压缩格式(身份,g

  • Dockerfile中的和命令之间有什么区别?什么时候我会使用一个命令而不是另一个命令? COPY指令将从复制新文件,并将它们添加到路径的容器文件系统中 ADD指令将从复制新文件,并将它们添加到路径的容器文件系统中。