【问题标题】:Starting container process caused: exec: "powershell": executable file not found in $PATH: unknown启动容器进程导致:exec:“powershell”:$PATH 中找不到可执行文件:未知
【发布时间】:2021-01-22 20:06:33
【问题描述】:

我正在尝试将我的 .net core 3.1 服务容器化到 linux Docker 容器中。该服务适用于 SQL Server 数据库,因此我有一个docker-compose,如下所示:

version: "3.5"

services:
    back:
        build: 
            context: ../../
            dockerfile: local_deploy/back/docker
        container_name: api
        restart: always
        environment:
          - ASPNETCORE_ENVIRONMENT=Development
        depends_on:
          - db-server
        ports:
          - "7000:80"
        networks:
          - localdev

    db-server:
        image: microsoft/mssql-server-linux:2017-latest
        container_name: db-server
        environment:
          - ACCEPT_EULA=Y
          - MSSQL_SA_PASSWORD=1234
          - MSSQL_TCP_PORT=1433
        ports:
          - "1400:1433"
        networks:
          - localdev

networks:
  localdev:
    name: localdev

要运行这个docker-compose,我在解决方案根文件夹内的local_deploy/back 目录中有一个up.bat 文件:

@echo off

echo Starting build
rd ..\..\out /s /Q
dotnet restore ../../MySimpleService.sln -s http://nexus.tools.example.com/nuget-v2/ -s https://nexus.eas.example.com/repository/nuget-hosted/
dotnet publish ../../MySimpleService.sln -c Release --force -o ../../out - /property:Version=1.0.0 /p:ASPNETCORE_ENVIRONMENT=Development

echo Starting containers
docker-compose up --build -d

最后,这是一个docker 文件:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
COPY out ./
ENTRYPOINT ["dotnet", "MySimpleService.dll"]

这三个文件都在local_deploy/back目录下。

当我在cmd 中运行up 命令时,容器构建成功。

问题在于该服务还使用 NATS 作为消息代理,因此它在容器内关闭,因为它无法与 NATS 建立连接。

要在我的本地计算机上安装和使用 NATS,我必须安装我们团队准备的 msi 文件。在我的机器上安装这个msi后,我可以在本地成功运行MySimpleService

所以,我猜,要将这个服务运行到容器中,我还应该将这个 msi 安装到容器中。我试图编辑我的docker 文件:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1

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

COPY out ./

RUN (New-Object System.Net.WebClient).DownloadFile('https://nexus.eas.example.com/repository/mars-nats-streaming-business/NatsStreaming_2.1.4-alpha386.msi', 'c:\tools\NatsStreaming_2.1.4-alpha386.msi') ;\
    Start-Process 'msiexec' -ArgumentList '/i c:\tools\NatsStreaming_2.1.4-alpha386.msi /quiet /qn /norestart /log c:\tools\installNatsStreaming.log'; \
    Start-Sleep -s 30 ;\
    Remove-Item c:\tools\*.msi -force

ENTRYPOINT ["dotnet", "MySimpleService.dll"]

但我得到一个错误:

服务“返回”未能构建:OCI 运行时创建失败:
container_linux.go:370:启动容器进程导致:exec:
“powershell”:在 $PATH 中找不到可执行文件:未知

现在我的猜测是我应该在容器中安装一个 powershell。

任何帮助将不胜感激。

【问题讨论】:

  • 您正在尝试将专为 Windows 设计的内容(.msi 文件)安装到容器中。为此,您将需要一个 Windows 容器。您不能将其安装到 Linux 容器中。它不仅是 powershell,而且像 c:\tools 和命令 msiexec 这样的路径在 Linux 中不起作用。我认为你根本无法在 Linux 上运行 Windows 容器。
  • NATS 似乎也可用于 Linux。你能安装那个 Linux 二进制文件而不是 msi 吗?此外,听起来您正试图在容器中运行两件事:NATS 代理和您的 .NET 应用程序。这不是一个好的设计:就像您的数据库服务器在单独的容器中运行一样,消息代理也应该如此。
  • @omajid,是的,我认为.msi 文件只能安装在 Windows 容器中。你证实了我的想法。谢谢你的建议,我会试试的。
  • 这个故事的继续this post

标签: docker powershell .net-core docker-compose containers


【解决方案1】:

我会说你的猜测 (Now my guess is that I should install a powershell into container.) 是正确的,是的 :)

我遇到了类似的问题,我选择将 PowerShell 命令替换为 shell 命令,这样可以确保兼容性。

但是,如果您无法用合适的 shell 替换您的 PowerShell 命令,那么您可以在 Docker 中使用 PowerShell,遵循documentation

【讨论】:

    猜你喜欢
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2018-09-21
    • 2022-11-10
    • 2020-01-15
    • 1970-01-01
    相关资源
    最近更新 更多