Pip 和 Powershell inside Docker: standard_init_linux.go:228: exec user process caused: exec format error

Pip and Powershell inside Docker: standard_init_linux.go:228: exec user process caused: exec format error

尝试使用 Powershell 和 pip 构建图像,然后 运行 调用内部 python 包的 Powershell 脚本:

> docker build --file gallery-dl.dockerfile --tag psu .
[+] Building 0.6s (9/9) FINISHED                                                          
 => [internal] load build definition from gallery-dl.dockerfile                      0.0s
 => => transferring dockerfile: 413B                                                 0.0s 
 => [internal] load .dockerignore                                                    0.0s 
 => => transferring context: 2B                                                      0.0s 
 => [internal] load metadata for mcr.microsoft.com/powershell:7.3.0-preview.3-ubunt  0.2s 
 => [internal] load build context                                                    0.0s
 => => transferring context: 36B                                                     0.0s 
 => [1/4] FROM mcr.microsoft.com/powershell:7.3.0-preview.3-ubuntu-focal-20220318@s  0.0s 
 => CACHED [2/4] RUN apt-get update &&     apt-get -qq -y install curl ca-certifica  0.0s 
 => CACHED [3/4] RUN pip3 install https://github.com/mikf/gallery-dl/archive/master  0.0s 
 => [4/4] COPY gallery-dl.ps1 /mydir/                                                0.1s 
 => exporting to image                                                               0.1s
 => => exporting layers                                                              0.1s 
 => => writing image sha256:6bd7be9979190bf2993e5473265284883b0c154c1e62f5bb27d74c0  0.0s 
 => => naming to docker.io/library/psu                                               0.0s 

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them

但出现以下错误:

> docker run -it --rm --name psutest psu
standard_init_linux.go:228: exec user process caused: exec format error

我的 Dockerfile:

FROM mcr.microsoft.com/powershell:7.3.0-preview.3-ubuntu-focal-20220318
RUN apt-get update && \
    apt-get -qq -y install curl ca-certificates python3-pip
RUN pip3 install https://github.com/mikf/gallery-dl/archive/master.zip https://github.com/yt-dlp/yt-dlp/archive/master.zip
COPY gallery-dl.ps1 /mydir/
ENTRYPOINT ["/mydir/gallery-dl.ps1"]

我做错了什么? 当直接在我的计算机上 运行 时,脚本 运行 很好。

这里有多个答案,但大多数都指的是 x64 架构。请找到link:

你 运行 将其放在 Linux 图像中(基于 Ubuntu 20.04“Focal Fossa”),其中默认 shell 通常是一些谍影重重 shell 的味道。您需要以某种方式告诉 Linux 它需要使用 Powershell 来 运行 脚本。

执行此操作的最佳方法是以“shebang”行开始脚本。这看起来大致像

#!/usr/bin/pwsh -File

每当脚本被标记为可执行(chmod +x gallery-dl.ps1)时,Linux(和任何其他 Unix)将找到 shebang 行和 运行 该命令,传递脚本名称和任何它的附加参数。这必须从文件的绝对第一个字节开始——在它之前没有注释或换行符或任何其他内容——这是 DOS 行结尾会导致问题的地方。由于这一行也是一个 Powershell 注释,它在 运行s.

时对脚本没有影响

您也可以将解释器放在 Docker 图像的命令中。这在某种程度上是在重复你自己,如果你有时需要 运行 一个备用脚本作为主容器进程,你将不得不为每个备用脚本重复 pwsh 解释器。

# instead of the ENTRYPOINT line you currently have
CMD ["/usr/bin/pwsh", "-File", "/mydir/gallery-dl.ps1"]