向Docker容器的标准输入发送当前目录中文件名列表字符串。

7
我有一个Docker容器,需要传递一个字符串(字符串数组也可以,但据我所知这不可能)包含当前目录中存在的文件名。
我的第一种策略是运行命令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;看起来容器或shell正在尝试在某个地方执行‘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"
2个回答

2
首先,您正在使用node:16,根据项目的入口点,它将调用node来执行您传递的任何参数。
在您的Dockerfile中,您调用了一个CMD而没有更改ENTRYPOINT,因此当您执行容器时,它将尝试使用node来执行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更改为ENTRYPOINT。值得注意的是,Linux的ls命令没有-p标志。

使用ENTRYPOINT正确地帮助我解决了问题,感谢您的指出。 - Otávio Monteagudo

1

1
这个看起来很有前途:https://groups.google.com/g/jenkinsci-users/c/w0Jc8OZYrgg/m/j1UUl2NACQAJ - mmarquezvacas
我会把它放在Gitlab CI管道中,谢谢! - Otávio Monteagudo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接