Kubernetes 中的 Dockerfile 入口点未执行

S N*_*S N 3 docker reactjs kubernetes

我有一个基于 docker 容器的基于 ReactJS 的应用程序,一个 shell 脚本在 docker 镜像中定义为 ENTRYPOINT,并且我能够成功使用 docker run image-name 。

\n

现在的任务是使用标准的deployment.yaml文件模板使用这个docker镜像进行Kubernetes部署,如下所示

\n
# Deployment file\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: my-app\n  labels:\n    app: my-app\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: my-app\n  template:\n    metadata:\n      labels:\n        app: my-app\n    spec:\n      terminationGracePeriodSeconds: 120\n      containers:\n      - name: my-app\n        imagePullPolicy: Always\n        image: my-docker-image\n        command: ["/bin/bash"]\n        args: ["-c","./entrypoint.sh;while true; do echo hello; sleep 10;done"]\n
Run Code Online (Sandbox Code Playgroud)\n
\n
kind: Service\napiVersion: v1\nmetadata:\n  name: my-service\nspec:\n  type: NodePort\n  selector:\n    app: my-app\n  ports:\n  - port: 3000\n    targetPort: 3000\n    protocol: TCP\n    nodePort: 31110\n
Run Code Online (Sandbox Code Playgroud)\n
\n
spec:\n  rules:\n  - http:\n      paths:\n      - path: /\n        pathType: Prefix\n        backend:\n          service:\n            name: my-service\n            port:\n              number: 3000\n
Run Code Online (Sandbox Code Playgroud)\n

当我执行 kubectl apply -f mydeployment.yaml 时,它会创建所需的 pod,但与直接运行 docker 映像不同,entrypoint.sh 脚本不会在创建 pod 时执行。有人可以帮忙分享上面的 yaml 文件有什么问题吗?我是否遗漏或做错了什么?

\n

我还尝试在 yaml 中直接调用 npm run start in command [] 但没有运气。我可以使用 kubectl exec 进入 pod 容器,但看不到 React 应用程序正在运行,我可以手动执行 entrypoint.sh 并在浏览器中查看所需的输出。

\n

编辑:添加 kubectl 日志并描述输出

\n

日志:当我从 yaml 中删除command/args并应用deploy.yaml时,我按原样得到以下日志,直到启动开发服务器线路,除此之外没有任何内容。

\n
> myapp start /app\n> react-scripts start\n\n\xe2\x84\xb9 \xef\xbd\xa2wds\xef\xbd\xa3: Project is running at http://x.x.x.x/\n\xe2\x84\xb9 \xef\xbd\xa2wds\xef\xbd\xa3: webpack output is served from \n\xe2\x84\xb9 \xef\xbd\xa2wds\xef\xbd\xa3: Content not from webpack is served from /app/public\n\xe2\x84\xb9 \xef\xbd\xa2wds\xef\xbd\xa3: 404s will fallback to /\nStarting the development server...\n
Run Code Online (Sandbox Code Playgroud)\n

描述输出

\n
Name:         my-view-85b597db55-72jr8\nNamespace:    default\nPriority:     0\nNode:         my-node/x.x.x.x\nStart Time:   Fri, 16 Apr 2021 11:13:20 +0800\nLabels:       app=my-app\n              pod-template-hash=85b597db55\nAnnotations:  cni.projectcalico.org/podIP: x.x.x.x/xx\n              cni.projectcalico.org/podIPs: x.x.x.x/xx\nStatus:       Running\nIP:           x.x.x.x\nIPs:\n  IP:           x.x.x.x\nControlled By:  ReplicaSet/my-view-container-85b597db55\nContainers:\n  my-ui-container:\n    Container ID:   containerd://671a1db809b7f583b2f3702e06cee3477ab1412d1e4aa8ac93106d8583f2c5b6\n    Image:          my-docker-image\n    Image ID:       my-docker-image@sha256:29f5fc74aa0302039c37d14201f5c85bc8278fbeb7d70daa2d867b7faa6d6770\n    Port:           <none>\n    Host Port:      <none>\n    State:          Terminated\n      Reason:       Completed\n      Exit Code:    0\n      Started:      Fri, 16 Apr 2021 11:13:41 +0800\n      Finished:     Fri, 16 Apr 2021 11:13:43 +0800\n    Last State:     Terminated\n      Reason:       Completed\n      Exit Code:    0\n      Started:      Fri, 16 Apr 2021 11:13:24 +0800\n      Finished:     Fri, 16 Apr 2021 11:13:26 +0800\n    Ready:          False\n    Restart Count:  2\n    Environment:\n      MY_ENVIRONMENT_NAME:                          TEST_ENV\n      MY_SERVICE_NAME:                              my-view-service\n      MY_SERVICE_MAIN_PORT:                         3000\n    Mounts:\n      /var/run/secrets/kubernetes.io/serviceaccount from default-token-9z8bw (ro)\nConditions:\n  Type              Status\n  Initialized       True \n  Ready             False \n  ContainersReady   False \n  PodScheduled      True \nVolumes:\n  default-token-9z8bw:\n    Type:        Secret (a volume populated by a Secret)\n    SecretName:  default-token-9z8bw\n    Optional:    false\nQoS Class:       BestEffort\nNode-Selectors:  <none>\nTolerations:     node.kubernetes.io/not-ready:NoExecute op=Exists for 300s\n                 node.kubernetes.io/unreachable:NoExecute op=Exists for 300s\nEvents:\n  Type     Reason     Age                From               Message\n  ----     ------     ----               ----               -------\n  Normal   Scheduled  32s                default-scheduler  Successfully assigned default/my-view-container-85b597db55-72jr8 to my-host\n  Normal   Pulled     31s                kubelet            Successfully pulled image "my-docker-image" in 184.743641ms\n  Normal   Pulled     28s                kubelet            Successfully pulled image "my-docker-image" in 252.382942ms\n  Normal   Pulling    11s (x3 over 31s)  kubelet            Pulling image "my-docker-image"\n  Normal   Pulled     11s                kubelet            Successfully pulled image "my-docker-image" in 211.2478ms\n  Normal   Created    11s (x3 over 31s)  kubelet            Created container my-view-container\n  Normal   Started    11s (x3 over 31s)  kubelet            Started container my-view-container\n  Warning  BackOff    8s (x2 over 26s)   kubelet            Back-off restarting failed container\n
Run Code Online (Sandbox Code Playgroud)\n

我的入口点.sh 是

\n
#!/bin/bash\n( export REACT_APP_ENV_VAR=env_var_value;npm run start )\nexec "$@"\n
Run Code Online (Sandbox Code Playgroud)\n

lar*_*sks 8

当您在 pod 描述中写入以下内容时:

      containers:
      - name: my-app
        imagePullPolicy: Always
        image: my-docker-image
        command: ["/bin/bash"]
        args: ["-c","./entrypoint.sh;while true; do echo hello; sleep 10;done"]
Run Code Online (Sandbox Code Playgroud)

command参数覆盖容器ENTRYPOINT。上面大致相当于:

docker run --entrypoint /bin/bash my-docker-image ...args here...
Run Code Online (Sandbox Code Playgroud)

如果你想使用ENTRYPOINT图像中的 ,那么只需设置args