我有这个Docker映像,其中安装了许多有用的工具。我在docker内部使用它来调试内容,例如测试与其他容器的连接。现在我想在Kubernetes中使用此图像。但是,由于它不运行进程,因此pod无法启动
Dockerfile:
FROM ubuntu:latest
RUN .... useful tools ...
还有kubernetes文件:
apiVersion: apps/v1
kind: Deployment
metadata:
name: uitls
spec:
replicas: 1
selector:
matchLabels:
bar: utils-xxl
template:
metadata:
labels:
bar: utils-xxl
spec:
containers:
- name: utils
image: jeanluca/base
当我尝试应用此广告连播时,它以CrashLoopBackOff
状态结束。 Kubernetes中有没有办法启动这个Pod?也许使用exec
和bash
?有什么建议吗?
答案 0 :(得分:4)
您可以kubectl run
一次性容器进行交互式调试。
kubectl run jeanluca-debug \
--generator=run-pod/v1 \
--rm -it \
--image=jeanluca/base
这基本上与具有相同选项的docker run
命令等效,只是容器名称是必需的位置参数。
此技术对于您描述的各种调试任务很有用。如果您的映像具有redis-cli
,mysql
或psql
客户端之类的工具,DNS host
或dig
之类的DNS查找工具,等等,则可能会很有用弄清楚为什么您的组合系统完全损坏了。图像的默认命令可以为CMD ["/bin/bash"]
,这很好,但是如果没有附加输入流,它将立即退出,因此您需要像这样通过kubectl run
运行它,而不是尝试获取它。部署以保持其生命力。
通常,保持容器或容器的运行实际上没有任何意义。当然,有一些技巧可以阻止Docker容器退出,但我建议您避免使用它们。
答案 1 :(得分:3)
如果您想要一个可以一直执行的Pod,可以将其用于执行和运行命令,则只需告诉容器打开外壳并进入睡眠状态即可。
类似这样的东西:
apiVersion: apps/v1
kind: Deployment
metadata:
name: uitls
spec:
replicas: 1
selector:
matchLabels:
bar: utils-xxl
template:
metadata:
labels:
bar: utils-xxl
spec:
containers:
- name: utils
image: jeanluca/base
command: ["/bin/sh"]
args: ["-c", "while true; sleep 999; done"]
答案 2 :(得分:1)
您可以尝试以下操作:
CMD tail -f /dev/null
的末尾添加dockerfile
。在这种情况下,应使用相同的部署yaml。OR
apiVersion: apps/v1
kind: Deployment
metadata:
name: uitls
spec:
replicas: 1
selector:
matchLabels:
bar: utils-xxl
template:
metadata:
labels:
bar: utils-xxl
spec:
containers:
- name: utils
image: jeanluca/base
command: ["tail"]
args: ["-f", "/dev/null"]
OR
docker run
参照this在类似kubectl run
的k8容器中运行容器。希望这会有所帮助。