【问题标题】:Running a shell script in docker container [duplicate]在docker容器中运行shell脚本[重复]
【发布时间】:2021-10-22 03:49:16
【问题描述】:

嗨,乐于助人的世界人民!

我正在进入容器化和 docker,我正在尝试创建一些基本容器。 我在 Windows 上运行 Docker。

我想创建一个使用 curl 命令运行 shell 脚本的容器。我在 docker 上找到了一个内置 curl 的图像。

我在 Windows 中的目录结构如下所示
curl_container(文件夹)
Dockerfile(文件)
curl_registry.sh(文件)

curl_registry.sh 代码是

#!/bin/bash
    
while :
do
HOSTNAME=$(hostname)
DATE=$(date +'%Y-%m-%d')
TIME=$(date +'%Y/%m/%d %X')

CURL_RESULT=`http://www.google.com | head -1`
    
echo $TIME  $HOSTNAME  $CURL_RESULT

sleep 5
done
exit

我的 Docker 文件看起来像这样

FROM eamonwoortman/alpine-python-curl-zip
MAINTAINER red_badger@burrow.uk
WORKDIR /
COPY . /
RUN ["chmod", "+x","curl_registry.sh"]
ENTRYPOINT [ "./curl_registry.sh" ]

我能够构建容器;

PS C:\temp\Docker\Curl_container> docker build -t curl_container:1.18 .
[+] Building 1.0s (8/8) FINISHED
 => [internal] load build definition from Dockerfile  0.0s
 => transferring dockerfile: 238B                     0.0s
 => [internal] load .dockerignore                     0.0s
 => [internal] load metadata for docker.io/eamonwoortman/alpine-python-curl-zip:latest               0.0s
 => CACHED [1/4] FROM docker.io/eamonwoortman/alpine-python-curl-zip                                 0.0s
 => [2/4] COPY . /                                                                                   0.1s
 => [3/4] RUN ["chmod", "+x","curl_registry.sh"]                                                         
 => writing image sha256:497b03c55d8e90e7eff43c8868e420498516477b9225ad6d3bdf0076ebe9d9ed         0.0s
 => naming to docker.io/library/curl_container:1.18                                               0.0s

但是当我运行它时,我收到以下错误

PS C:\temp\Docker\Curl_container> docker run 497b03c55d8e
standard_init_linux.go:228: exec user process caused: no such file or directory
我想让脚本在文件夹 /apps 中运行,但我认为这是我的问题,因此尝试将文件放入根目录。 我已经尝试使用 ADD 命令代替 COPY 并且得到了相同的结果。 curl_registry.sh 在 windows 中显示为 .sh 文件。

我已经通过 notepad++ 运行我的 sh 文件并转换为 unix LF。

【问题讨论】:

    标签: windows bash docker containers


    【解决方案1】:

    您的 alpine 映像没有 bash 解释器。您需要将您的解释器更改为 ash 并修复您的 curl 命令

    #!/bin/ash
        
    while :
    do
    HOSTNAME=$(hostname)
    DATE=$(date +'%Y-%m-%d')
    TIME=$(date +'%Y/%m/%d %X')
    
    CURL_RESULT=`curl -s -N http://www.google.com | head -1`
        
    echo $TIME  $HOSTNAME  $CURL_RESULT
    
    sleep 5
    done
    exit
    

    【讨论】:

    • 请注意,docker 容器内的 hostname 将返回容器 ID,这可能不是您想要的。您希望通过主机名得到什么?如果它是主机的主机名,那么如果没有一些体操,docker 就无法使用它。您可以将 --hostname 选项添加到您的 docker run 命令中,以在运行时注入主机名,但我不清楚这实际上会给您带来什么。你来这里的目的是什么?
    • 嘿 Pahool,谢谢,我会给它一个狂欢。 (灰!)它奏效了!我之前在另一个线程上读过,他们建议安装 bash,但这更整洁,谢谢。我真的不明白为什么没有 bash 解释器会给我一个找不到文件的错误?我肯定会期待一个不同的错误吗?我很高兴主机名成为容器,因为我会将结果流式传输到 Splunk,如果容器被丢弃并重新启动,这也将作为警报。干杯,
    • 我认为“找不到文件”的错误是由于没有找到/bin/bash造成的。
    【解决方案2】:

    在容器内使用 bash 并运行命令并解决出现的错误,然后当命令运行时,您可以将这些命令添加到 dockerfile。

    sudo docker exec -it (container name) /bin/bash

    默认情况下,您是 docker 容器中的 root 用户。

    【讨论】:

    • 嗨,Shaqil,我已经将图像作为独立运行。我已经做了一个 mkdir -p /app 在那个目录中我创建了我的 bash 脚本并成功运行它。我知道我是 root,我只是想在文件夹中保持整洁。
    • 我很想看看你成功运行的输出。您的图像甚至有 bash 解释器吗?我尝试构建它,但没有看到可用的 bash。
    猜你喜欢
    • 2022-10-20
    • 2015-10-13
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多