Dockerfile:找不到复制的文件

我正在尝试将一个shell脚本添加到一个容器,然后作为我的构build的一部分运行它。

以下是dockerfile的相关部分:

#phantomjs install COPY conf/phantomjs.sh ~/phantomjs.sh RUN chmod +x ~/phantomjs.sh && ~/phantomjs.sh 

这里是构build期间的输出:

 Step 16 : COPY conf/phantomjs.sh ~/phantomjs.sh ---> Using cache ---> 8199d97eb936 Step 17 : RUN chmod +x ~/phantomjs.sh && ~/phantomjs.sh ---> Running in 3c7ecb307bd3 [91mchmod: [0m[91mcannot access '/root/phantomjs.sh'[0m[91m: No such file or directory[0m[91m 

我正在复制的文件存在于构build目录下的conf文件夹中…但是我所做的任何事情似乎都不会被复制。

TL; DR

COPY指令中不要依赖像~这样的shell扩展。 改用COPY conf/phantomjs.sh /path/to/user/home/phantomjs.sh

详细的解释

使用~作为用户主目录的快捷方式是由你的shell(即Bash或ZSH)提供的function。 Dockerfile中的COPY指令不在shell中运行; 他们只是将文件path作为参数(另见手册 )。

这个问题可以很容易地用最小的Dockerfile来复制:

 FROM alpine COPY test ~/test 

然后build立并运行:

 $ echo foo > test $ docker built -t test $ docker run --rm -it test /bin/sh 

在容器中运行ls -l / ,你会发现docker build没有扩展到/root/ ,但是实际上用文件test创build了一个名为~的目录:

 / # ls -l /~/test.txt -rw-r--r-- 1 root root 7 Jan 16 12:26 /~/test.txt 

不知道,但也许~在Dockerfile中引用您的$HOME ,主机上的/home/$USER

我会尝试将~$HOME的引用更改为显式文件夹/root

 #phantomjs install COPY conf/phantomjs.sh /root/phantomjs.sh RUN chmod +x /root/phantomjs.sh && /root/phantomjs.sh 

当您使用COPY命令时,不是Docker可以理解的上下文。 它只会在/〜/phantomjs.sh中创build一个名为〜的文件夹。 使用$HOME引用或明确提及在正确的上下文中使用此path。

将所需的文件从github repo下载到Build文件夹中,再次运行build命令,它会在构build过程中拾取文件。