我的目录仅包含两个文件,Dockerfile并且sayhello.sh:
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出现错误:
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特有的)?
debian:jessie
Alpine附带ash作为默认外壳,而不是bash。
bash
所以你可以
有一个shebang将/ bin / bash定义为sayhello.sh的第一行,因此您的文件sayhello.sh将以bin / sh开头
#!/bin/sh
就像您期望的那样,在您的Alpine映像中安装Bash,就像在Dockerfile中这样一行:
RUN apk add --no-cache --upgrade bash