如何从Docker中的shell脚本调用函数?

如何从Docker中的shell脚本调用函数?,docker,dockerfile,sh,Docker,Dockerfile,Sh,我正在尝试调用docker容器中的函数runaudit 包含runaudit函数的shell脚本被复制到映像内部,并且BASH_ENV环境变量被设置为指向/etc/audittools/audit.sh 我的问题是,如何在容器中运行这个runaudit函数 我试图在容器内运行它,但收到以下消息 / # runaudit /bin/sh: runaudit: not found ENV输出显示环境变量已设置 随附Dockerfile和small shell函数 注意:真正的函数要大得多,我需要将

我正在尝试调用docker容器中的函数runaudit

包含runaudit函数的shell脚本被复制到映像内部,并且BASH_ENV环境变量被设置为指向/etc/audittools/audit.sh

我的问题是,如何在容器中运行这个runaudit函数

我试图在容器内运行它,但收到以下消息

/ # runaudit
/bin/sh: runaudit: not found
ENV输出显示环境变量已设置

随附Dockerfile和small shell函数

注意:真正的函数要大得多,我需要将它保存在它自己的文件中

我非常感谢你在这方面的任何建议或帮助

Dockerfile

Shell脚本-audit.sh

运行函数


您可以这样运行它:

docker run -ti test sh -c "source /etc/audittools/audit.sh && runaudit"

将其更改为普通shell脚本;在一般编程术语中,使其成为程序而不是函数

请记住,docker run使用干净的环境启动一个新容器,运行其主程序,然后退出。还要记住,shell脚本和shell函数之间的区别在于,函数在其调用shell的上下文中运行,可以更改环境变量和其他设置,而shell脚本在新的shell环境中运行;但是,由于在docker运行上下文中,父shell环境即将被破坏,所以这并不重要

所以我将shell脚本改为

!/bin/bash ^^^使用标准外壳位置 移除函数包装器 回声你好世界 然后更改Dockerfile以在启动时运行它

... 复制audit.sh/etc/audittools 运行chmod a+x/etc/audittools/audit.sh CMD[/etc/audittools/audit.sh]
你好,大卫,谢谢你的回复。不幸的是,我需要为我在Kubernetes中使用的其他容器公开审计函数。My Jenkins CI/CD管道使用不同的容器作为其构建阶段的一部分。您不能再次以这种方式公开Docker或Kubernetes中的函数,作为通用编程语句,而不是特定于shell函数。最值得注意的是,docker运行将审计一个只包含审计脚本的新空容器。您的CI系统可能每个映像Dockerfile需要将脚本复制到正在生成的映像中。
#!/usr/bin/env sh
function runaudit() {
    echo "Hello World"
}
docker run -it test /bin/sh runaudit
docker run -ti test sh -c "source /etc/audittools/audit.sh && runaudit"