bash - 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
解决方案
这不是 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
) 才能运行脚本。
推荐阅读
- multithreading - Scala 在服务器上执行期货的方式与在开发机器上不同
- python - 如何在 Python 中使用`async for`?
- asp.net - asp.net mvc 使用 SCrypt 比较密码
- python - PostgreSQL INSERT INTO 类型转换错误:字符串格式化期间并非所有参数都转换
- python - 如何计算特定时间范围内的时间
- css - px2rem 中的 remUnit 选项是如何配置的?
- c++ - 计算地图结构的哈希
- nginx - 无法将 nginx HTTP 流量重定向到 HTTPS
- mysql - MySQL(RDBMS)用于订单/运输信息,MongoDB(NoSQL)用于产品信息。这能行吗?
- ios - 输入/输出从操作系统更改时的AudioKit监听器/通知?