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

时间:2019-08-19 08:46:25

标签: docker dockerfile sh

我正在尝试在Docker容器内部调用函数runaudit

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

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

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

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

ENV输出显示出已设置了环境变量。

此处带有Dockerfile和小型Shell函数。

注意:真正的功能要大得多,我需要将其保留在自己的文件中。

我对此表示感谢或帮助。

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"

Shell脚本-audit.sh

#!/usr/bin/env sh
function runaudit() {
    echo "Hello World"
}

运行功能

docker run -it test /bin/sh runaudit

2 个答案:

答案 0 :(得分:2)

您可以这样运行它:

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

答案 1 :(得分:2)

将其更改为普通的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"

然后更改Dockerfile以在启动时运行它

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