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过程中拾取文件。