«Система не может найти указанный файл». при запуске задачи ECS Fargate

#.net #docker #dockerfile #amazon-ecs #aws-fargate

#.net #docker #докерфайл #amazon-ecs #aws-fargate

Вопрос:

Я пытаюсь запустить задачу Fargate (Windows) в AWS ECS, но она завершается неудачей, как только переходит в состояние «ОЖИДАНИЕ». Я не уверен, чего мне не хватает. Существует только 1 возможный файл, который мог бы вызвать это, Wait-Service.ps1 но я не понимаю, почему он не должен быть найден.

Wait-Service.ps1 Файл находится в bin/Debug папке.

Это мой Dockerfile :

 # escape=

FROM mcr.microsoft.com/windows/servercore:ltsc2019

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

RUN "mkdir C:temp"

WORKDIR "C:/service"

COPY bin/Debug/ .

RUN "C:/Windows/Microsoft.NET/Framework64/v4.0.30319/installutil.exe" /LogToConsole=true /ShowCallStack ./SprProductionDataService.exe; 
  Set-Service -Name ""SprProductionDataService"" -StartupType Automatic; 

#The container stays up as long as this process is running.
CMD "C:/service/Wait-Service.ps1" -ServiceName "SprProductionDataService" -StartupTimeout 10 -AllowServiceRestart;
 

Я вижу только это сообщение об ошибке (в консоли AWS).:

 Status reason   CannotStartContainerError: CannotStartContainerError: 
hcs::System::CreateProcess 5d85964e54844ae0ad18140057019deb-4109322994: 
The system cannot find the file specified.: unknown
 

Обновить:

Я попытался запустить контейнер, вытащив его из репозитория ECR, и он также потерпел неудачу:

 PS D:_CodeSPRProductionDataServiceSprProductionDataService> docker run --name sprprod -it spr-production-service-dev-ecr:latest 208555724522.dkr.ecr.us-west-2.amazonaws.com/spr-production-service-dev-ecr:latest powershell
docker: Error response from daemon: container e1658203aca736881659e1a5445e8d0ec549ccf94fe2f2952012752e330d9826 encountered an error during hcsshim::System::CreateProcess: failure in a Windows system call: The system cannot find the file specified. (0x2)
[Event Detail:  Provider: 00000000-0000-0000-0000-000000000000]
[Event Detail:  Provider: 00000000-0000-0000-0000-000000000000]
[Event Detail: onecorevmcomputemanagementorchestrationvmhostedcontainerprocessmanagement.cpp(173)vmcomputeagent.exe!00007FF7FACA9F4B: (caller: 00007FF7FAC5E13A) Exception(2) tid(3a4) 80070002 The system cannot find the file specified.
    CallContext:[Bridge_ProcessMessageVmHostedContainer_ExecuteProcess]
 Provider: 00000000-0000-0000-0000-000000000000].
 

Комментарии:

1. Привет, может быть, для вас лучше всего использовать Qovery ?

2. @eVoxmusic спасибо за сообщение. Однако добавление еще одного (платного) инструмента в нашу команду только для развертывания этого проекта не будет ускоряемым. Мы используем Terraform по всей компании

Ответ №1:

Проблема здесь в том, как была указана ENTRYPOINT / CMD.

В первом Dockerfile вы указали CMD в shell форме. Во втором Dockerfile вы указали ENTRYPOINT и CMD в exec форме. обратитесь к этому

По сути, ECS Fargate запускает среду выполнения containerd, и эта среда выполнения не подходит для обработки формы оболочки.

Существует открытая проблема github, которая описывает поведение.

Ответ №2:

Покопавшись еще немного, я обнаружил, что пропустил указание ENTRYPOINT контейнера, который в моем случае есть powershell . Нижеприведенное dockerfile сработало для меня:

 # escape=

FROM mcr.microsoft.com/windows/servercore:ltsc2019

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

RUN "mkdir C:temp"

WORKDIR "C:/service"

COPY bin/Debug/ .

# For debugging purposes only
#RUN Enable-WindowsOptionalFeature -Online -FeatureName "TelnetClient"

RUN "C:/Windows/Microsoft.NET/Framework64/v4.0.30319/installutil.exe" /LogToConsole=true /ShowCallStack ./SprProductionDataService.exe; 
  Set-Service -Name "SprProductionDataService" -StartupType Automatic; 

#The container stays up as long as this process is running.
ENTRYPOINT ["powershell.exe"]
CMD ["C:/service/Wait-Service.ps1", "-ServiceName", "SprProductionDataService", "-StartupTimeout", "10", "-AllowServiceRestart"];