【问题标题】:Run a shell script with arguments on any given file with docker run使用 docker run 在任何给定文件上运行带有参数的 shell 脚本
【发布时间】:2020-07-05 09:25:56
【问题描述】:

我是一名 docker 初学者。我已经使用这个SO post 来运行带有 docker run 的 shell 脚本,这工作正常。但是,我想要做的是将我的 shell 脚本应用到我当前工作目录中的一个文件,Dockerfile 和脚本就在其中。

我的 shell 脚本 - 给定一个文件作为参数,返回它的名称和行数:

#!/bin/bash
echo $1
wc -l $1

Dockerfile:

FROM ubuntu
COPY ./file.sh /
CMD /bin/bash file.sh

然后构建并运行:

docker build -t test .
docker run -ti test /file.sh text_file

这是我得到的:

text_file
wc: text_file: No such file or directory

我不知道为什么第二行不起作用,为什么找不到文件。我不想将我的 text_file 复制到容器中。理想情况下,我想在当前工作目录中的任何文件上从 docker 容器运行我的脚本。 任何帮助都感激不尽。 谢谢!!

【问题讨论】:

    标签: bash shell docker


    【解决方案1】:

    您正在构建包含脚本 /file.sh 的 Docker 映像。不过,您的 Docker 容器不包含(或不知道)您作为参数传递的文件 text_file。

    为了让你的 Docker 容器知道它,你必须在运行容器时 mount 它。

    docker run --rm -it -v "$PWD"/text_file:/text_file test /file.sh /text_file
    

    为了检查其他文件,您只需在挂载和参数中交换 text_file。

    注意事项

    除了Docker volume mounts,我可能会建议您进行一些改进来为您的形象增添趣味。

    1. 为了运行脚本,您不必使用ubuntu 作为基本映像。 alpine 甚至更专注于 bash,您可能会觉得很好。并且不要忘记使用标签来随着时间的推移强制执行完全相同的行为。
    2. 您可以将脚本设置为 Dockerfile 的 ENTRYPOINT。然后,您只需将脚本名称(在这种情况下为 text_file)指定为您的命令。
    3. 挂载文件时,您可以更改容器中文件的名称。因此,您可以简化脚本,只需在每次运行容器时将要测试的文件挂载到完全相同的位置。
    FROM alpine:3.10
    
    WORKDIR /tmp
    
    COPY file.sh /usr/local/bin/wordcount
    
    ENTRYPOINT /usr/local/bin/wordcount
    
    CMD file
    

    那么,

    docker run --rm -it -v "PWD"/text_file:/tmp/file test 
    

    会做的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      • 2013-08-10
      • 1970-01-01
      • 1970-01-01
      • 2021-06-26
      • 1970-01-01
      • 2011-10-09
      相关资源
      最近更新 更多