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

v64noz0r  于 2023-01-16  发布在  Docker
关注(0)|答案(3)|浏览(159)

我正在尝试调用我的Docker容器中的一个函数runaudit
将包含runaudit函数的shell脚本复制到映像内部,并将BASH_ENV环境变量设置为指向/etc/audittools/audit.sh
我的问题是,如何在我的容器中运行这个runaudit函数?
我尝试在容器内运行它,但得到以下消息。

/ # runaudit
/bin/sh: runaudit: not found

ENV输出显示环境变量已经设置。
这里有Dockerfile和小shell函数.

    • 注意:**真正的函数要大得多,我需要在它自己的文件中维护它。

我很感激任何建议或帮助。

    • 停靠文件**
FROM alpine:3.10

MAINTAINER acme

ARG VERSION=0.3.0

RUN apk add --no-cache curl tar gettext libintl

RUN envsubst --version

RUN mkdir -p /etc/audittools

COPY audit.sh /etc/audittools

RUN chmod a+x /etc/audittools/audit.sh

ENV BASH_ENV "/etc/audittools/audit.sh"
    • shell 脚本-www.example.comaudit.sh
#!/usr/bin/env sh
function runaudit() {
    echo "Hello World"
}
    • 运行函数**
docker run -it test /bin/sh runaudit
s71maibg

s71maibg1#

将其更改为普通的shell脚本;在通用编程术语中,使它成为一个“程序”而不是一个“函数”。
记住docker run在一个干净的环境中启动一个新的容器,运行它的主程序,然后退出。还记住shell脚本和shell函数之间的区别在于函数运行在它调用的shell的上下文中,并且可以改变环境变量和其他设置,而shell脚本运行在一个新的shell环境中;但由于在docker run上下文中父shell环境即将被拆除,因此这并不重要。
所以我将shell脚本更改为

#!/bin/bash
# ^^^ use the standard shell location
# vvv remove the function wrapper
echo "Hello World"

然后更改停靠文件以在启动时运行它

...
COPY audit.sh /etc/audittools
RUN chmod a+x /etc/audittools/audit.sh
CMD ["/etc/audittools/audit.sh"]
m4pnthwp

m4pnthwp2#

你可以这样运行它:

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

vc9ivgsu3#

我尝试使用CMD命令,它在Dockerfile内部对我来说工作得很好。

CMD ["/etc/audittools/audit.sh", "runaudit"]

您可以在audit.sh的chmod后添加这一行。您的最终dockerfile将类似于:

FROM alpine:3.10

MAINTAINER acme

ARG VERSION=0.3.0

RUN apk add --no-cache curl tar gettext libintl

RUN envsubst --version

RUN mkdir -p /etc/audittools

COPY audit.sh /etc/audittools

RUN chmod a+x /etc/audittools/audit.sh

ENV BASH_ENV "/etc/audittools/audit.sh"

CMD ["/etc/audittools/audit.sh", "runaudit"]

相关问题