我的目录只包含两个文件Dockerfile
和sayhello.sh
:
.
├── Dockerfile
└── sayhello.sh
Dockerfile
读取
FROM alpine
COPY sayhello.sh sayhello.sh
CMD ["sayhello.sh"]
和sayhello.sh
只包含
echo hello
Dockerfile
成功构建:
kurtpeek@Sophiemaries-MacBook-Pro ~/d/s/trybash> docker build --tag trybash .
Sending build context to Docker daemon 3.072 kB
Step 1/3 : FROM alpine
---> 665ffb03bfae
Step 2/3 : COPY sayhello.sh sayhello.sh
---> Using cache
---> fe41f2497715
Step 3/3 : CMD sayhello.sh
---> Using cache
---> dfcc26c78541
Successfully built dfcc26c78541
但是,如果我尝试run
,我会收到executable file not found in $PATH
错误:
kurtpeek@Sophiemaries-MacBook-Pro ~/d/s/trybash> docker run trybash
container_linux.go:247: starting container process caused "exec: \"sayhello.sh\": executable file not found in $PATH"
docker: Error response from daemon: oci runtime error: container_linux.go:247: starting container process caused "exec: \"sayhello.sh\": executable file not found in $PATH".
ERRO[0001] error getting events from daemon: net/http: request canceled
造成这种情况的原因是什么? (我记得以类似的方式在基于debian:jessie
的图像中运行脚本,所以也许它是特定于Alpine的?)
答案 0 :(得分:40)
Alpine附带/bin/sh
作为默认shell而不是/bin/bash
。
所以你可以
有一个shebang定义/ bin / sh作为你的sayhello.sh的第一行,所以你的文件sayhello.sh将以
开头#!/bin/sh
在您的Alpine图片中安装Bash,因为您似乎期望Bash存在,在Dockerfile中有这样一行:
RUN apk add --update bash && rm -rf /var/cache/apk/*
答案 1 :(得分:11)
This answer完全正确且工作正常。
还有另一种方式。您可以在基于Alpine的Docker容器中运行Bash脚本。
您需要更改CMD,如下所示:
CMD ["sh", "sayhello.sh"]
这也有效。
答案 2 :(得分:6)
请记住为所有脚本授予执行权限。
FROM alpine
COPY sayhello.sh /sayhello.sh
RUN chmod +x /sayhello.sh
CMD ["/sayhello.sh"]
答案 3 :(得分:2)
使用CMD
,Docker正在搜索sayhello.sh
中的PATH
文件,但您将其复制到/
PATH
中CMD ["/sayhello.sh"]
因此,请使用要执行的脚本的绝对路径:
wd_host
BTW,正如@ user2915097所说,请注意,如果你的脚本在shebang中使用它,Alpine默认没有Bash。