Bash 使用docker向Pod注入脚本将返回EOF

Bash 使用docker向Pod注入脚本将返回EOF,bash,docker,kubernetes,eof,Bash,Docker,Kubernetes,Eof,我的目标是在kubernetes中的一个永久运行的pod上执行一次脚本。pod名为busybox-,它位于名称空间default。因此,我编写了这个脚本,名为扫描一个pod。sh: #!/bin/bash export MASTER_IP=192.168.56.102 export SCRIPT_NAME=script.sh export POD_NAMESPACE=default export POD_NAME=busybox echo "echo HALLO" | ssh ubuntu@$

我的目标是在kubernetes中的一个永久运行的pod上执行一次脚本。pod名为
busybox-
,它位于名称空间
default
。因此,我编写了这个脚本,名为
扫描一个pod。sh

#!/bin/bash
export MASTER_IP=192.168.56.102
export SCRIPT_NAME=script.sh
export POD_NAMESPACE=default
export POD_NAME=busybox

echo "echo HALLO" | ssh ubuntu@$MASTER_IP
export POD_ID=$(kubectl get po | grep busybox | sed -n '1p'|awk '{print $1}')
kubectl cp $SCRIPT_NAME $POD_NAMESPACE/$POD_ID:.
kubectl exec  $POD_ID -- chmod +x $SCRIPT_NAME
export CONTAINER_ID=$(kubectl describe pod busybox | grep 'Container ID' | sed -n '1p'|awk '{print $3}')
ssh -t ubuntu@$MASTER_IP "sudo docker exec -u root $CONTAINER_ID -- ./script.sh"
引用的脚本
script.sh
包含以下内容:

$ kubectl exec  $POD_ID --  cat script.sh
#!/bin/bash
echo "test" >> test
cp test test-is-working
但是,无法在pod上运行脚本:

  • 未创建文件
    test
    test正在工作
  • 脚本
    scan one pod.sh
    只返回
    EOF

    $ ./scan-one-pod.sh
    Pseudo-terminal will not be allocated because stdin is not a terminal.
    Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-87-generic x86_64)
    
     * Documentation:  https://help.ubuntu.com
     * Management:     https://landscape.canonical.com
     * Support:        https://ubuntu.com/advantage
    
    155 Software-Pakete können aktualisiert werden.
    72 Aktualisierungen sind Sicherheitsaktualisierungen.
    
    
    HALLO
    [sudo] Passwort für ubuntu:
    EOF
    Connection to 192.168.56.102 closed.
    
  • 如果我在kubernetes控制器上直接远程执行
    docker
    -命令,我会收到与
    EOF
    相同的消息:

    ubuntu@controller:~$ export CONTAINER_ID=$(kubectl describe pod busybox | grep 'Container ID' | sed -n '1p'|awk '{print $3}')
    ubuntu@controller:~$ sudo docker exec -u root $CONTAINER_ID  ./script.sh
    EOF
    
  • 如果我通过
    kubectl exec
    从本地工作站执行,我会得到以下错误:

    $ kubectl exec  $POD_ID  ./script.sh
    rpc error: code = 13 desc = invalid header field value "oci runtime error: exec failed: container_linux.go:247: starting container process caused \"no such file or directory\"\n"
    
    我不知道他们指的是哪个丢失的文件,但是
    script.sh
    -文件存在并且busybox pod似乎正在运行:

    $ kubectl exec  $POD_ID  ls script.sh
    script.sh
    
    $ kubectl get po busybox-6bdf9b5bbc-4skds
    NAME                       READY     STATUS    RESTARTS   AGE
    busybox-6bdf9b5bbc-4skds   1/1       Running   10         12d
    
问题:据我所知,
EOF
表示文件结束。哪一个文件的结尾对我来说很重要,为什么这是一个问题


提前感谢,非常感谢您的帮助:)

我自己已经发现了一个错误:
busybox
的图像没有提供bash程序。因此,我更改了复制到busybox的脚本
script.sh
。它现在使用
/bin/sh
。但是:仍然是
EOF
和上面发布的另一个错误,
没有这样的文件或目录
ssh-t ubuntu@$MASTER\u IP“sudo docker exec-u root$CONTAINER\u ID-->/script.sh”
您解决了一个错误的问题:如果目标是执行脚本,为什么不使用为该任务设计的
kubectl exec
?独立而言,我大约80%确信EOF是由
sudo
试图请求密码引起的,但“由于stdin不是终端,因此不会分配伪终端。”谢谢,
kubectl exec
-提示确实解决了我的问题。实际上,我以前已经尝试过了,但我做错了,我试图用
/
-命令执行脚本。正确的是:
kubectl exec$POD\u ID--sh script.sh
。错误的是:
kubectl exec$POD\u ID-->script.sh
如果exec需要
sh script.sh
那么它可能是无效的,尽管我很乐意承认
/
根据
exec
的当前工作目录可能很奇怪(我认为这是
/
,但这也可能是
Dockerfile
WORKDIR
的副作用。)