bash - 将当前目录中的文件名列表作为单个字符串发送到 Docker 容器的 STDIN
问题描述
我有一个 Docker 容器,需要传递一个字符串(字符串数组也可以,但据我所知这是不可能的),其中包含当前目录中存在的文件的名称。
我获取容器内文件名的第一个策略是运行 command docker build -t doc-validate . && docker run doc-validate (printf "%s " $(ls -p | grep -v /))
,将输出(printf "%s " $(ls -p | grep -v /))
直接发送到容器的 STDIN 中,但是,我zsh: bad pattern: (printf %s Dockerfile
作为错误返回;在我看来,容器或外壳正试图在某处执行“Dockerfile”,我不知道为什么会发生这种情况,因为printf
直接在终端中运行相同的命令可以按预期工作(仅打印当前目录中的文件名) .
我的第二种方法是尝试将这些文件名作为环境变量发送到容器。在终端中运行PROJECT_FILES=(printf "%s " $(ls -p | grep -v /))
按预期工作,$PROJECT_FILES
输出这些文件名。但是,如果我尝试像这样将它直接传递到容器中:docker build -t doc-validate . && docker run --env PROJECT_FILES=(printf "%s " $(ls -p | grep -v /)) doc-validate
我会得到与zsh: bad pattern: PROJECT_FILES=(printf %s Dockerfile
错误相同的结果。
在我看来,由于“zsh:”出现在错误输出中,命令甚至在进入容器之前就失败了,但是,我不明白为什么在终端中独立运行它们是有效的,以及为什么将它们作为参数传递给容器真是头疼。
如何将(printf "%s " $(ls -p | grep -v /))
在本地机器上运行的输出作为容器内可访问的值?
Dockerfile:
FROM node:16
WORKDIR /moduleRoot
COPY package.json /moduleRoot
RUN npm install
COPY . /moduleRoot/
# Authorize execution of entrypoint bash script
RUN chmod +x /moduleRoot/docker-container-entrypoint.sh
# these values below will be set later, just register them explicitly here
ENV PROJECT_FILES=""
CMD [ "/moduleRoot/docker-container-entrypoint.sh" ]
Bash 入口点(CMD 中的 docker-container-entrypoint.sh 文件):
#!/bin/bash
echo "Args are: $@"
echo "PROJECT_FILES=$PROJECT_FILES"
解决方案
首先,您正在使用node:16
and 根据项目的入口点,它将调用node
以执行您作为参数传递的任何内容。
在您Dockerfile
调用 aCMD
而不是更改ENTRYPOINT
时,因此当您执行容器时,它将尝试使用节点执行 bash 脚本,您一定会收到如下错误:
/moduleRoot/docker-container-entrypoint.sh:2
echo "Args are: $@"
^^^^^^^^^^^^^^
SyntaxError: Unexpected string
at Object.compileFunction (node:vm:353:18)
at wrapSafe (node:internal/modules/cjs/loader:1039:15)
at Module._compile (node:internal/modules/cjs/loader:1073:27)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1138:10)
at Module.load (node:internal/modules/cjs/loader:989:32)
at Function.Module._load (node:internal/modules/cjs/loader:829:14)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:76:12)
at node:internal/main/run_main_module:17:47
如果您的 bash 脚本只是为了帮助您排除故障,那么您可以使用在线heredoc
传递您需要的参数:
» docker run -t --rm doc-validate <<< echo $(ls -a1)
Args are: docker-container-entrypoint.sh Dockerfile package.json
PROJECT_FILES=
另一方面,如果您需要 bash 脚本,则必须更改CMD
with ENTRYPOINT
。另一件值得注意的事情是 Linuxls
没有-p
标志。
推荐阅读
- swift - 线程 0 崩溃
- javascript - Vue 和 Vuex 在 store 模块中做 Axios 操作
- javascript - 如何正确映射数组以访问其嵌套数组中的属性?
- database - 基于资源的授权数据库模式
- amazon-web-services - 如何处理对 Amazon Lex 的 lambda 响应?
- kubernetes - Kubernetes 微服务之间的通信
- json - 如何从 json 嵌套对象返回布尔值
- javascript - 我想删除 mikkymax 文件
- python - 如何使用 Flask、jinja2 动态更改表状态(已发送、已发送、已取消)
- flutter - 通过本地化代理进行日期格式本地化?