簡體   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