通过Bash脚本读取文本文件中的行

时间:2018-10-12 12:42:20

标签: bash docker

我要读取文本文件中的行:

$SSH_PRIVATE_FILE="address"

我想以一种向已定义的SSH_PRIVATE_FILE赋值的方式读取和评估该行。

以下是docker文件的内容

ARG SSH_PRIVATE_FILE
COPY build-params build-params
RUN while IFS='' read -r line || [ -n "$line" ]; do\
    echo "Text read from file: $line";\
    eval `$line`;\
    done < "build-params"

RUN echo $SSH_PRIVATE_FILE

已更新

但是它返回错误:/ bin / sh:1:$ SSH_PRIVATE_FILE =“〜/ .ssh / id_rsa”:找不到

2 个答案:

答案 0 :(得分:0)

Bourne类型的shell具有内置的机制来读取文本文件的内容并评估每一行,即.指令。 (GNU bash在名称source下具有相同的功能,但这不是POSIX Shell标准的一部分,并且Docker基本映像中的某些轻量级Shell不支持它。 。)在shell级别,您写的内容等同于

. ./build-params

但是,每个Dockerfile RUN行都运行一个单独的容器,该容器带有一个具有干净shell环境的单独shell,因此,事实证明这是设置环境变量的一种非常糟糕的方法。 Dockerfile ENV指令效果更好。

此外,由于您正在编写Dockerfile,因此您可以完全控制Dockerfile内的文件系统布局,并且您实际上并不需要在Docker容器内所在位置进行参数设置。 。如果是凭据之类的东西,则可以使用docker run -v选项将其注入到容器中。如果需要这样的设置,我可以说我的Dockerfile

ENV SSH_PRIVATE_FILE=/ssh/id_rsa

然后实际启动容器为

docker run -v $HOME/.ssh:/ssh ...

并且完全不将其作为构建时选项。

答案 1 :(得分:-1)

一个疯狂的猜测,但是我尝试在每行的每个\之前放置一个空格。