我正在尝试将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文件夹中......但无论我做什么,它似乎都不会被复制。
答案 0 :(得分:8)
不要在~
指令中依赖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命令,它将在构建过程中拾取文件。