【问题标题】:starting container process caused: exec: "[\"/bin/sh -c\"": stat ["/bin/sh -c": no such file or directory启动容器进程导致: exec: "[\"/bin/sh -c\"": stat ["/bin/sh -c": no such file or directory
【发布时间】:2021-09-28 01:56:07
【问题描述】:

我正在通过 Docker 和 ECS Fargate 构建和部署应用程序。我在 ECS 任务定义中定义了我的入口点命令。将映像推送到私有 ECR 存储库后,当 ECS Fargate 尝试部署 docker 映像时出现此错误。任何意见将是有益的。下面是 dockerfile、任务定义和错误。

Dockerfile

FROM centos:7
COPY /src/main/build/application.zip /tmp/application.zip

COPY /src/main/residual-container-setup/application/init.sh /tmp/init.sh

#Environment variables and Entry point being defined via task definition    

任务定义

{
"containerDefinitions": [
    {
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/application",
          "awslogs-region": "us-east-2",
          "awslogs-stream-prefix": "ecs"
        }
      },
      "entryPoint": [
        "[\"/bin/sh -c\"",
        "\"/tmp/init.sh\"]"
      ],
      "portMappings": [
        {
          "hostPort": 9003,
          "protocol": "tcp",
          "containerPort": 9003
        }
      ],
      "cpu": 0,
      "environment": [
        {
          "name": "HOST",
          "value": "dev.application.com"
        },
        {
          "name": "REST_PORT",
          "value": "8003"
        }
      ],
      "mountPoints": [],
      "volumesFrom": [],
      "image": "xxxxxxxxxxxx.dkr.ecr.us-east-2.amazonaws.com/application:latest",
      "essential": true,
      "name": "application"
    }
  ]

错误

container_linux.go:380: starting container process caused: exec: "[\"/bin/sh -c\"": stat ["/bin/sh -c": no such file or directory

我尝试使用以下命令在本地运行容器:`docker run -it $docker_image /bin/sh

我什至无法执行到容器中。我相信我可能需要在图像中额外安装才能使其正常工作。任何建议都会有所帮助。

更新 我已经使用以下命令更新了 dockerfile 以更新 init 脚本的权限:chmod +x /tmp/init.sh

我还将任务定义入口点属性更新为["/bin/sh", "-c", "/tmp/init.sh"]

进行这些更改后,我现在看到以下内容:

container_linux.go:380: starting container process caused: exec: "-c": executable file not found in $PATH

【问题讨论】:

  • 它必须是["/bin/sh", "-c", "/tmp/init.sh"]——或者实际上,如果你的文件有shebang和执行权限,它可能只是["/tmp/init.sh"]。但是使用所有文字引号而不是句法引号从表面上看是错误的,将-c/bin/sh 混在一起也是如此。
  • 错误消息的含义与它的含义完全相同:您没有名为 /bin/sh -c 的文件。它正在查找该名称的文件,因为您将-c 作为参数列表的第一部分的一部分,它被视为要运行的程序的名称。该程序只是/bin/sh。它的第一个参数应该是-c,它的第二个参数应该是/tmp/init.sh。这些东西中的每一个都应该是一个单独的数组条目。因此,["/bin/sh", "-c", "/tmp/init.sh"].
  • 我已更新 dockerfile 以使用以下命令使 init.sh 可执行: chmod +x /tmp/init.sh 在构建 docker 映像并将入口点更新为 [/tmp/init .sh],我收到以下错误:container_linux.go:380:启动容器进程导致:exec:“-c”:$PATH 中找不到可执行文件
  • 这个新错误意味着你有["-c", "/tmp/init.sh"] 没有"sh""bash" 首先。如果删除"bash",还需要删除"-c"
  • 这是一个比以前更好的错误。现在,该文件的shebang是什么?如果它不是以#!/usr/bin/env bash(或#!/bin/sh,等等——指向容器中实际存在的外壳)之类的开头,那就是你接下来需要解决的问题。

标签: docker amazon-ecs ecs-taskdefinition aws-fargate


【解决方案1】:

您的入口点定义错误。 你这样做的方式 Linux 认为二进制文件的路径是“/bin/sh -c”。如果您检查容器图像,我很确定您也找不到该文件。

【讨论】:

    猜你喜欢
    • 2019-07-16
    • 1970-01-01
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2020-07-15
    相关资源
    最近更新 更多