繁体   English   中英

命令未传递给 docker 入口点

[英]command not passed to docker entrypoint

我一直在尝试创建一个使用自定义 OCI 变量执行 kubectl 的 docker 映像。 它会自动创建 OCI 配置文件,然后生成 kube/.config 文件。 我之所以考虑使用它,是因为我们有多个集群,并且每次从它们中跳转非常耗时,而且很容易出错或混淆它们。

基本上,我使用以下入口点创建了 Dockerfile:

FROM private.repo/oci-image:latest
# Install Kubectl client
RUN apt update && apt install -y curl gettext-base
RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.24.0/bin/linux/amd64/kubectl
RUN chmod +x ./kubectl
RUN mv ./kubectl /usr/local/bin/kubectl
...
...
...
ENTRYPOINT ["/bin/bash", "-c", "./script.sh"]

这是 script.sh 文件

#!/bin/sh

set -e
cat $HOME/.oci/config-template | envsubst > $HOME/.oci/config 

yes | oci ce cluster create-kubeconfig --profile DEFAULT --cluster-id ${K8S_CLUSTER_ID} --file $HOME/.kube/config --region ${REGION} --token-version 2.0.0 --kube-endpoint PUBLIC_ENDPOINT
yes | oci ce cluster create-kubeconfig --profile DEFAULT --cluster-id $K8S_CLUSTER_ID --file $HOME/.kube/config --region $REGION --token-version 2.0.0 --kube-endpoint PUBLIC_ENDPOINT

exec "$@"

" 我一直在尝试运行容器并将 kubectl 命令传递给它:

docker run -e ... oci-agent:v21 kubectl get nodes

但我没有得到任何回应。 我尝试用 exec "kubectl $@" 替换 exec "$@" 但我获得了 kubectl 帮助说明,所以它只执行 kubectl 而没有读取我的命令。 请问我该怎么做?

ENTRYPOINT中删除bash -c包装器

ENTRYPOINT ["./script.sh"]

您已经知道CMD作为参数传递给ENTRYPOINT 使用bash -c包装器,这些参数作为附加参数传递给包装器外壳,而不是您的脚本。 包装外壳总是运行./script.sh不带参数,因为这是它被要求运行的命令; CMD参数可以作为位置参数$0$1 ,...在该命令中访问,但这很不寻常。

这与ENTRYPOINT必须是 JSON 数组才能实际接收CMD作为参数的原因相同:Docker 将字符串形式的ENTRYPOINT (或CMDRUN )转换为["/bin/sh", "-c", "the string"]和参数实际上并没有传递给包装脚本。 (您几乎不需要在 Dockerfile 中使用sh -c 。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM