【发布时间】: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