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 start
、eval $(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
对于 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 start
、eval $(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