我已经编写了一个Python脚本来运行命令,以便使用subprocess执行nerdctlshell命令,
res = subprocess.run(
f"nerdctl --host '/host/run/containerd/containerd.sock' --namespace k8s.io commit {container} {image}",
shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, executable='/bin/bash')
我在一个ubuntu容器中运行这个python脚本,当我在容器中sh并通过传递参数来运行这个脚本时
python3 run_script.py b3425e7a0d1e image1
它可以正常执行,但当我使用调试模式运行它时
kubectl debug node/pool-93oi9uqaq-mfs8b -it --image=registry.digitalocean.com/test-registry-1/nerdctl@sha256:56b2e5690e21a67046787e13bb690b3898a4007978187800dfedd5c56d45c7b2 -- python3 run_script.py b3425e7a0d1e image1
我收到错误信息
b'/bin/bash:第1行:nerdctl:未找到命令\n '
有人能帮助/指出哪里出了问题吗?
运行脚本. py
import subprocess
import sys
container = sys.argv[1]
image = sys.argv[2]
res = subprocess.run(
f"nerdctl --host '/host/run/containerd/containerd.sock' --namespace k8s.io commit {container} {image}",
shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, executable='/bin/bash')
print(res)
停靠文件
FROM ubuntu:latest
RUN rm /bin/sh && ln -s /bin/bash /bin/sh
LABEL version="0.1.0"
RUN apt-get -y update
RUN apt-get install wget curl -y
RUN wget -q "https://github.com/containerd/nerdctl/releases/download/v1.0.0/nerdctl-full-1.0.0-linux-amd64.tar.gz" -O /tmp/nerdctl.tar.gz
RUN mkdir -p ~/.local/bin
RUN tar -C ~/.local/bin/ -xzf /tmp/nerdctl.tar.gz --strip-components 1 bin/nerdctl
RUN echo -e '\nexport PATH="${PATH}:~/.local/bin"' >> ~/.bashrc
RUN source ~/.bashrc
1条答案
按热度按时间oxcyiej71#
机械方面:您正在安装的二进制文件不在
$PATH
中。您可能将其解压缩到容器文件系统中的/root/.local/bin
中,但从未将其添加到$PATH
中。由于每个RUN
命令都在新的shell中运行,因此最后一行RUN source
没有任何作用(从技术上讲是一个新的容器),所以它所做的更改会立即丢失。前面的行试图更改一个shell点文件,但是在Docker中运行东西的大多数路径根本不读取shell点文件。这里最简单的解决方案是将二进制文件解压缩到
$PATH
中已经存在的目录中,比如/usr/local/bin
。不过,运行这个程序会遇到第二个更大的问题。容器通常不能访问主机的容器运行时来操作容器。在标准Docker中,如果你可以启动容器,你可以简单地设置主机系统的根。可以将Docker套接字装入容器中,但需要认真考虑安全性问题。
你的问题对Kubernetes有几点暗示,我希望一个负责任的集群管理员能够让绕过集群容器运行时并以这种方式潜在地危害节点变得几乎不可能。如果你使用Kubernetes,你可能根本无法访问主机容器运行时,无论它是Docker本身还是其他东西。
从哲学上讲,看起来就像您在尝试编写
commit
命令,使用commit
几乎从来都不是最佳实践。在Kubernetes附近有几个实际问题(您将提交哪个副本?您将如何保存生成的映像?您将如何重用它?)但是拥有映像您可以't从源重新创建可能会导致以后的问题,例如进行安全更新。