如何在Alpine Docker容器中运行Bash脚本?

时间:2017-06-28 13:31:48

标签: bash docker dockerfile alpine

我的目录只包含两个文件Dockerfilesayhello.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的?)

4 个答案:

答案 0 :(得分:40)

Alpine附带/bin/sh作为默认shell而不是/bin/bash

所以你可以

  1. 有一个shebang定义/ bin / sh作为你的sayhello.sh的第一行,所以你的文件sayhello.sh将以

    开头
    #!/bin/sh
    
  2. 在您的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文件,但您将其复制到/ PATHCMD ["/sayhello.sh"]

因此,请使用要执行的脚本的绝对路径:

wd_host

BTW,正如@ user2915097所说,请注意,如果你的脚本在shebang中使用它,Alpine默认没有Bash。