当前位置: 首页 > 面试题库 >

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

易淳
2023-03-14
问题内容

我的目录仅包含两个文件,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特有的)?


问题答案:

Alpine附带ash作为默认外壳,而不是bash

所以你可以

  1. 有一个shebang将/ bin / bash定义为sayhello.sh的第一行,因此您的文件sayhello.sh将以bin / sh开头

    #!/bin/sh
    
  2. 就像您期望的那样,在您的Alpine映像中安装Bash,就像在Dockerfile中这样一行:

    RUN apk add --no-cache --upgrade bash
    


 类似资料:
  • 问题内容: 我想从下面的程序中运行一个shell脚本,但它似乎无能为力。我已经直接在linux终端中运行了相同的命令,它运行正常,所以我猜这是我的Java代码。如您所见,我首先使用PrintWriter将命令写入Shell脚本,但我希望这不会影响Shell脚本本身的运行。任何帮助,将不胜感激! 问题答案: 您应该使用返回的结果。 将命令作为单独的进程执行,并返回类型为的对象。您应该调用以便程序等待

  • 问题内容: 我有一些要自动执行的SQL脚本。过去,我使用过SQL * Plus,并从bash脚本中手动调用了sqlplus二进制文件。 但是,我试图找出是否有一种方法可以连接到数据库,并从bash脚本内部调用该脚本……以便我可以插入查询并使查询相对于特定天数运行过去。 问题答案: 我有点困惑。您应该能够从bash脚本中调用sqlplus。这可能就是您在第一个陈述中所做的 尝试在bash脚本中执行以

  • 我很难弄明白这一点。 所以我有一个基于Ubuntu映像的dockerfile。在我的dockerfile的末尾,我有: 什么都没发生..docker ps显示没有正在运行的容器 但如果我跑: 容器开始运行,我在shell中,docker ps显示这个容器正在运行。所有工作都按预期进行,但我的django项目不在那里,我的理解是运行/bin/bash会覆盖dockerfile中的CMD,这意味着dj

  • 问题内容: Bash脚本非常有用,可以节省很多编程时间。那么,如何在C ++程序中启动bash脚本呢?另外,如果您知道如何使用户成为超级用户,那也会很好。谢谢! 问题答案: 使用功能。

  • 问题内容: 我正在尝试创建用于设置Docker容器的Shell脚本。我的脚本文件如下所示: 运行此脚本文件将在新调用的bash中运行容器。 现在,我需要运行一个脚本文件(test.sh),该文件已经位于上述给定的shell脚本的容器内(例如:cd /path/to/test.sh && ./test.sh),该怎么做? 问题答案: 您可以使用以下命令在正在运行的容器中运行命令: 并从bash会话运

  • 问题内容: 如何在 根用户 (具有所有权限)而不是 没人 用户(php默认用户)下从PHP运行bash脚本? 在sudo visudo之后,多数民众赞成在我的输出: 问题答案: 您可以使用sudo: 您应该允许在没有密码提示的情况下执行脚本。在控制台中运行,并将以下字符串添加到末尾: 您必须正确设置文件模式,以确保没有人可以修改此脚本并将危险内容放入该脚本(在根控制台中):