我正在尝试在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
答案 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"]