首页 > 解决方案 > Docker Ubuntu 选择了错误的目录

问题描述

我对 Docker 还很陌生,并试图通过尝试在其中运行 Steam 服务器来熟悉自己。

我的 Dockerfile 如下:

FROM ubuntu:20.10

RUN dpkg --add-architecture i386 \ 
    && apt-get update \
    && apt-get install -y \
    curl \
    ca-certificates \
    libgcc1 \
    && apt-get clean autoclean \
    && apt-get autoremove -y \
    && rm -rf /var/lib/apt/lists/*

RUN mkdir -p steam/cmd \
    && cd steam \
    && curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxvf - -C cmd

RUN ./steam/cmd/steamcmd.sh +quit

我无法弄清楚为什么最后一步会引发此错误:

Step 4/4 : RUN ./steam/cmd/steamcmd.sh +quit
 ---> Running in c3f673328fe6
./steam/cmd/steamcmd.sh: line 37: /steam/cmd/linux32/steamcmd: No such file or directory
The command '/bin/sh -c ./steam/cmd/steamcmd.sh +quit' returned a non-zero code: 127

为什么会./steam/cmd/steamcmd.sh被翻译成/steam/cmd/linux32/steamcmd?

步骤 3/3 没有放在steamcmd.sh里面linux32

Step 3/4 : RUN mkdir -p steam/cmd     && cd steam     && curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxvf - -C cmd
 ---> Running in fa5dcd1fcadc
steamcmd.sh
linux32/steamcmd
linux32/steamerrorreporter
linux32/libstdc++.so.6
linux32/crashhandler.so

使用WORKDIR steam/cmdthen 跟进它RUN也会返回相同的结果。

标签: dockerubuntuwindows-subsystem-for-linux

解决方案


请参阅此讨论:https ://askubuntu.com/questions/133389/no-such-file-or-directory-but-the-file-exists

尝试apt install libc6-i386作为步骤 2 的一部分进行。

RUN dpkg --add-architecture i386 \ 
    && apt-get update \
    && apt-get install -y \
    curl \
    ca-certificates \
    libgcc1 \
    libc6-i386 \
    && apt-get clean autoclean \
    && apt-get autoremove -y \
    && rm -rf /var/lib/apt/lists/*

同样jfyi,该sh文件并没有像您想象的那样被“翻译”。

如果你真的打开它sh,你会看到它试图调用linux32可执行文件(它调用它$STEAMEXE)。

如果你想自己解决这样的问题,我是这样调查的:

  1. 我复制了您的 dockerfile,但注释/删除了最后一个(损坏的)步骤。
  2. 我用docker build -t helpthiscoder .
  3. 我得到了图像docker start helpthiscoder; docker run -i -t helpthiscoder bash
  4. 我查看sh了图像上的文件。apt update; apt install vim; vim /steam/cmd/steamcmd.sh.
  5. 在这个文件中,我添加了我自己的echo $STEAMEXE以查看路径是/steam/cmd/linux32/steamcmd.
  6. /steam/cmd/linux32跑过去ls -lah查看该文件是否存在且可执行。
  7. 我跑去file steamcmd获取信息。然后我看到它是32位的。
  8. 然后我用谷歌搜索linux 32-bit file not found error Ubuntu 20并找到了我在第一段中提到的链接。:/

我现在得到一个不同的错误:

Redirecting stderr to '/root/Steam/logs/stderr.txt'
threadtools.cpp (3787) : Assertion Failed: Probably deadlock or failure waiting for thread to initialize.
ILocalize::AddFile() failed to load file "public/steambootstrapper_english.txt".
[  0%] Checking for available update...
threadtools.cpp (3787) : Assertion Failed: Probably deadlock or failure waiting for thread to initialize.
Thread failed to initialize
CWorkThreadPool::StartWorkThread: Thread creation failed.
Exiting on SPEW_ABORT

我会继续研究它。我强烈建议您删除最后一条断线并构建一个您可以按照我上面提到的方式“探索”的图像。这就是我得到这个新错误的方式。


推荐阅读