Minikube,python 高山:python 找不到命令

Minikube, python alpine : python command not found

对于 K8 的专家来说,这听起来像是一个非常愚蠢的问题。但是我已经为此苦苦挣扎了一段时间,因此出现了下面的问题。

我正在尝试通过 Minikube 和 docker 在本地部署一个简单的 Kubernetes 应用程序来测试 sidecar 容器模式。

让我们从 sidecar 容器元素开始:

Docker文件

FROM python:3.6-alpine

RUN pip install boto3==1.14.20
RUN pip install --upgrade awscli s3cmd
   
ENV APP_HOME_DIR=/home/sidecar
RUN mkdir $APP_HOME_DIR

ADD run.sh $APP_HOME_DIR
ADD s3_sync.py $APP_HOME_DIR
RUN chmod +x $APP_HOME_DIR/s3_sync.py
RUN chmod +x $APP_HOME_DIR/run.sh

ENV BUCKET_NAME=
ENV PROJECT_NAME=
ENV FEATURE_BRANCH=
ENV LOCAL_DIR=

WORKDIR $APP_HOME_DIR


ENTRYPOINT ["./run.sh"]

run.sh

#!/bin/sh

while true
do
    echo "Triggering an S3-SYNC"
    python /home/sidecar/s3_sync.py -b $BUCKET_NAME -p $PROJECT_NAME -f $FEATURE_BRANCH -l $LOCAL_DIR
    sleep 10
done

以及python文件的简化版本s3_sync.py:

import logging
import argparse

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[logging.FileHandler("debug.log"), logging.StreamHandler()],
)

logger = logging.getLogger(__name__)

MASTER = "master"

def main():

    bucket_name = args.bucket_name
    project_name = args.project_name
    branch = args.feature_branch
    local_dir = args.local_dir
    sync_type = "production" if branch == MASTER else "review"

    logger.info(f"S3-SYNC starting for {sync_type} environment")



if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("-b", "--bucket_name", help="s3 bucket name", required=True)
    parser.add_argument("-p", "--project_name", help="project name to sync", default="")
    parser.add_argument("-f", "--feature_branch", help="git feature branch name", default="master")
    parser.add_argument("-l", "--local_dir", help="local dir where to sync the s3 objects", required=True)

    args = parser.parse_args()
    main()

如果我构建上面的内容并运行它通过:

docker build -t sidecar_python .
docker run -e BUCKET_NAME=MYBUCKET -e PROJECT_NAME=MYPROJECT -e FEATURE_BRANCH=MYBRANCH -e LOCAL_DIR=/home sidecar_python

事情运行顺利

然后我将 Kubernetes 部署 yaml 文件中的 sidecar 与另一个本地 Docker 图像结合起来:

k8_deployment.yml

apiVersion: v1
kind: Pod
metadata:
  name: mc1
spec:
  volumes:
    - name: dags
      emptyDir: {}
  containers:
    - name: readdag
      image: dag_reader
      imagePullPolicy: Never
      volumeMounts:
        - name: dags
          mountPath: /usr
    - name: sidecar
      image: sidecar_python:latest
      imagePullPolicy: Never
      env:
        - name: BUCKET_NAME
          value: "MYBUCKET"
        - name: PROJECT_NAME
          value: "MYPROJECT"
        - name: FEATURE_BRANCH
          value: "MYBRANCH"
        - name: LOCAL_DIR
          value: "/usr"
      volumeMounts:
        - name: dags
          mountPath: /usr

dag_reader 图像是另一个本地图像,为了简短起见,我不会 post 它的 Docker 文件,因为它非常简单,不在我的问题范围内。

然后我运行 通常:minikube starteval $(minikube docker-env)docker build.. 两张图片,最后是kubectl apply -f k8_deployment.yml.

如果我执行:

kubectl get po
NAME   READY   STATUS    RESTARTS   AGE
mc1    2/2     Running   0          2m7s

事情看起来不错。

但是如果我检查 sidecar 容器的日志:

kubectl logs -f mc1 sidecar

Triggering an S3-SYNC
./run.sh: line 6: python: not found

所以python没有找到,我找不到pod中容器运行ning找不到python的原因,但是容器[=81] =]ning standalone in docker can.

pod 中的另一个容器 运行ning 抛出相同的错误:还有一个 python alpine 图像。

谁能解释一下为什么?我是不是做错了什么?

谢谢, 阿莱西奥

/usr目录包含各种系统和应用软件。特别是,Python 二进制文件通常位于 Linux 系统(或容器)上的 /usr/bin/python3 中。

您的 Kubernetes YAML 在 /usr 上安装了一个 emptyDir 卷。这会隐藏该目录树中的所有内容,包括 Python 二进制文件和所有 Python 系统库。这导致了这个错误。

将卷安装在其他地方可以避免这个问题。容器化应用程序往往不会对“标准”FHS 路径过于挑剔,所以我可能会设置

  env:
    - name: LOCAL_DIR
      value: "/dags"
  volumeMounts:
    - name: dags
      mountPath: /dags