Dockerfile:找不到复制的文件

时间:2016-01-16 12:19:51

标签: docker dockerfile

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

这是dockerfile的相关部分:

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

这是构建期间的输出:

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

我正在复制的文件存在于构建目录下面的conf文件夹中......但无论我做什么,它似乎都不会被复制。

4 个答案:

答案 0 :(得分:8)

TL; DR

不要在~指令中依赖COPY等shell扩展。请改用COPY conf/phantomjs.sh /path/to/user/home/phantomjs.sh

详细说明

使用~作为用户主目录的快捷方式是shell提供的功能(即Bash或ZSH)。 Dockerfile中的COPY指令不在shell中运行;他们只是将文件路径作为参数(另请参阅manual)。

使用最小的Dockerfile可以轻松复制此问题:

FROM alpine
COPY test ~/test

然后构建并运行:

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

在容器中运行ls -l / 时,您会发现docker build未将~展开到/root/,但实际上创建了名为~的目录,其中包含文件test

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

答案 1 :(得分:3)

不确定,但Dockerfile中的~可能会引用主机上的$HOME/home/$USER

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

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

答案 2 :(得分:0)

当您使用~命令时,

COPY不是Docker理解的上下文。它只需在/~/phantomjs.sh中创建一个名为〜的文件夹。  使用$HOME来引用或明确提及在正确的上下文中使用它的路径。

答案 3 :(得分:0)

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