Это может показаться очень глупым вопросом для экспертов K8. Но я долго боролся с этим, поэтому вопрос ниже.
Я пытаюсь развернуть локально простое приложение Kubernetes через Minikube и docker для тестирования шаблона контейнера sidecar.
Начнем с элементов контейнера sidecar:
Dockerfile
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_syn c .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
все работает без сбоев.
Затем я комбинирую сопроводительный файл в yaml-файле развертывания Kubernetes с другим локальным 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 - это еще один локальный образ, для краткости я не буду публиковать его Dockerfile, поскольку он очень простой и выходит за рамки моего вопроса.
Затем я запускаю обычное: minikube start
, eval $(minikube docker-env)
, docker build..
из 2 изображений и в конце kubectl apply -f k8_deployment.yml
.
Если я выполню:
* 10 43 *
все выглядит хорошо.
Но затем, если я проверю логи контейнера с коляской:
kubectl logs -f mc1 sidecar
Triggering an S3-SYNC
./run.sh: line 6: python: not found
Итак, python не найден, я не могу найти причина, по которой контейнер, работающий в модуле, не может найти python, но контейнер, работающий автономно в модуле docker, может.
Та же ошибка возникает для другого контейнера, запущенного в модуле: у одного есть изображение python alpine.
Кто-нибудь может объяснить почему? Я что-то здесь не так делаю?
Спасибо, Алессио