Dockerfile:找不到复制的文件

Pau*_*ulB 4 docker dockerfile

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

这是dockerfile的相关部分:

#phantomjs install
COPY conf/phantomjs.sh ~/phantomjs.sh
RUN chmod +x ~/phantomjs.sh && ~/phantomjs.sh
Run Code Online (Sandbox Code Playgroud)

这是构建期间的输出:

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
Run Code Online (Sandbox Code Playgroud)

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

hel*_*ert 8

TL; DR

不要依赖shell扩展类似~COPY说明.使用COPY conf/phantomjs.sh /path/to/user/home/phantomjs.sh,而不是!

详细解释

使用~用户主目录的快捷方式是shell提供的功能(即Bash或ZSH).COPYDockerfile中的指令不在shell中运行; 他们只是将文件路径作为参数(也参见手册).

使用最小的Dockerfile可以轻松地重现此问题:

FROM alpine
COPY test ~/test
Run Code Online (Sandbox Code Playgroud)

然后构建并运行:

$ echo foo > test
$ docker built -t test
$ docker run --rm -it test /bin/sh
Run Code Online (Sandbox Code Playgroud)

ls -l / 容器内部运行时,您将看到docker build没有扩展~/root/,但实际上创建了以~该文件命名的目录test:

/ # ls -l /~/test.txt 
-rw-r--r--    1 root     root             7 Jan 16 12:26 /~/test.txt
Run Code Online (Sandbox Code Playgroud)


小智 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
Run Code Online (Sandbox Code Playgroud)