如何在Docker容器中调用shell脚本内的runaudit函数?
解决Docker容器内
runaudit命令找不到的问题 首先得戳破核心问题:BASH_ENV是Bash专属的环境变量,但你运行容器时用的是Alpine默认的/bin/sh(本质是Ash shell,不是Bash),所以这个环境变量根本不会被Ash识别,自然加载不了定义runaudit函数的脚本。
下面给你几个可行的解决方案,按需选择:
方案1:改用Bash作为运行shell
既然你配置了Bash专属的环境变量,最简单的办法就是在容器里用Bash执行命令:
- 先修改Dockerfile,安装Bash:
FROM alpine:3.10 MAINTAINER acme ARG VERSION=0.3.0 RUN apk add --no-cache curl tar gettext libintl bash # 新增bash安装 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" - 运行容器时指定Bash执行命令:
或者进入交互模式后直接调用:docker run -it test /bin/bash -c runauditdocker run -it test /bin/bash # 进入容器后直接输入 runaudit 就能执行
方案2:针对Ash shell配置自动加载脚本
如果不想切换到Bash,想继续用Alpine默认的Ash,可以通过Ash的启动配置自动加载脚本:
- 修改Dockerfile,把脚本添加到Ash的profile配置中:
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 # 新增:让Ash每次启动时自动加载audit.sh RUN echo ". /etc/audittools/audit.sh" >> /etc/profile.d/audittools.sh - 运行容器时需要用登录shell模式(
-l参数)触发profile加载:
或者进入交互模式时用登录shell:docker run -it test /bin/sh -l -c runauditdocker run -it test /bin/sh -l # 输入 runaudit 即可执行
方案3:临时应急调用(无需修改Dockerfile)
如果只是临时测试,不想改镜像,可以直接在命令里手动加载脚本并执行函数:
docker run -it test /bin/sh -c ". /etc/audittools/audit.sh && runaudit"
额外提醒
- 你的
audit.sh开头用#!/usr/bin/env sh没问题,但要确保脚本里的语法是Ash兼容的(如果用Ash的话),别用Bash专属的语法特性。 - 可以先进入容器验证脚本存在性:
ls /etc/audittools/audit.sh,再查看内容确认:cat /etc/audittools/audit.sh。
内容的提问来源于stack exchange,提问作者Chesneycar
相关产品推荐
相关产品推荐

