当前位置: 首页 > 知识库问答 >
问题:

将当前目录中的文件名列表作为单个字符串发送到Docker容器的STDIN

暴奕
2023-03-14

我有一个Docker容器,需要传递一个字符串(字符串数组也可以,但据我所知这是不可能的),其中包含当前目录中存在的文件名。

我在容器中获取文件名的第一个策略是运行命令docker build-t doc-valester。

我的第二种方法是尝试将这些文件名作为环境变量发送到容器。在终端中运行PROJECT_FILES=(printf“%s”$(ls-p | grep-v/)时,会按预期工作,$PROJECT_FILES输出这些文件名。但是,如果我尝试像这样将其直接传递到容器中:docker build-t doc validate。

在我看来,它的命令甚至在进入容器之前就失败了,因为'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个答案

令狐辉
2023-03-14

如果您正在与Jenkins一起使用CI管道,那么这个问题/答案可能适合您:如何使用Jenkins docker容器装载docker卷?

宋斌
2023-03-14

首先,您使用的是节点:16,根据项目的入口点,它将调用节点,以执行作为参数传递的任何内容。

在你的Dockerfile中,你调用的是CMD,而不是更改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脚本,则必须使用ENTRYPOINT更改CMD。另一件值得注意的事情是Linux的ls没有-p标志。

 类似资料:
  • 我正在尝试将当前的工作目录挂载到Docker容器上,但没有工作。这是我的Dockerfile 我想,它们应该只安装在容器上,并且只有输出将在当前工作目录中生成。抱歉,我对Docker很陌生,我需要一些帮助....

  • 如何将字符串列表连接到单个字符串中?

  • -v标志还可以用于从主机装入单个文件(而不仅仅是目录)。 这将使您进入一个新容器中的bash shell,您将获得来自主机的bash历史记录,当您退出容器时,主机将获得在容器中键入的命令的历史记录。 Docker版本为1.9.1,版本为A34A1D5。 这是一个文件问题,是我这边的一个误解,还是有其他的事情发生了?

  • 问题内容: 我有这样的事情: 我想将这些文件重命名为以下形式: 在同一目录中。 我想我可以使用,但是我不知道如何在文件夹和文件重命名的同时使用它。 问题答案: 可以使用bash for loop和: 请注意,如果目录名称包含空格,则上述解决方案将不起作用。相关链接。 另一种基于注释的解决方案(也适用于名称中也包含空格的目录):

  • 有没有更简单的方法将列表中的字符串项串联成单个字符串?我可以使用函数吗? 例如。这是输入,这是所需的输出

  • 问题内容: 在Python中,我只想列出当前目录中的所有文件。我不希望从任何子目录或父目录中列出文件。 似乎确实有类似的解决方案,但它们似乎对我不起作用。这是我的代码段: 假设我在当前目录中有2个文件holygrail.py和Tim。我也有一个文件夹,其中包含两个文件- 我们称它们为Arthur和Lancelot。当我运行脚本时,这就是我得到的: 我对holygrail.py和Tim感到满意。但是