[英]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
(或CMD
或RUN
)轉換為["/bin/sh", "-c", "the string"]
和參數實際上並沒有傳遞給包裝腳本。 (您幾乎不需要在 Dockerfile 中使用sh -c
。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.