首页 > 解决方案 > Dockerfile 的 COPY 命令不能正常工作

问题描述

我正在创建一个脚本,将其复制到容器中并尝试运行。但是,COPY 命令似乎无法正常工作。

以下是 Dockerfile 的内容。

FROM busybox:latest
COPY random.sh /bin/random.sh
ENTRYPOINT /bin/random.sh

下面是要复制的脚本文件的内容。

#!/bin/bash
trap "exit" SIGINT
mkdir /var/htdocs

SET=$(seq 0 999999)

for i in $SET

do
        echo "Running $RANDOM" > /var/htdocs/index.html
        sleep 10
done

并且在Dockerfile所在的目录下,要复制的脚本存在如下。

-rw-r--r-- 1 pp pp   76 Oct  4 09:19 Dockerfile
-rwxr-xr-x 1 pp pp  154 Oct  4 09:33 random.sh*

通过在 Dockerfile 所在目录中运行以下命令,将镜像上传到 Dockerhub。

docker build -t dockerhubid/repo .
docker push dockerhubid/repo

并使用以下命令启动容器。

docker start dockerhubid/repo

但是,容器不会以以下错误启动。为什么我找不到复制的脚本?

/bin/bash: line 1: /bin/random.sh: not found

标签: bashdockerdockerfile

解决方案


这不是 DockerCOPY命令的问题,而是脚本开头的脚本解释器 shebang。该错误不是声称/bin/random.sh不存在,而是它找不到脚本解释器/bin/bash

Busybox 图像没有解释/bin/bash器,只有/bin/sh. 如果您的脚本仅与 bash 兼容,则您需要安装 Bash 解释器,或者将第一行 shebang 更改为#!/bin/sh. 粗略一看,我认为这个示例脚本是/bin/sh兼容的。

针对 Windows 主机构建时的另一个重要注意事项是,文件通常使用CRLF(即\r\n)行结尾,这与 Linux shebangs 不兼容(例如,它将解析为/bin/sh\r)。文件结尾需要正确设置为LF(ie \n) 才能运行脚本。


推荐阅读