Dockerfile ENTRYPOINT脚本:现有文件上没有“此类文件或目录”

时间:2019-03-24 22:42:53

标签: docker dockerfile ubuntu-server

我已经写了一个Dockerfile,意在将游戏服务器托管在Docker容器中,但是被复制到该容器中的shell脚本(“ run.sh”)看不到它是ELF可执行文件应该运行。

我已经配置了Dockerfile,使其使用最新版本的ubuntu软件包,将游戏服务器的文件下载并提取到新文件夹中,然后删除.zip存档。它可以成功构建,但是当我尝试使用由三行组成的简单shell脚本运行它时:

run.sh

#!/usr/bin/env bash
pwd
ls
exec ./TerrariaServer.bin.x86 -steam -config ./config.txt

它始终显示以下错误:./run.sh: line 4: /ServerFiles/TerrariaServer.bin.x86: No such file or directory

pwdls确认TerrariaServer.bin.x86目录中存在/ServerFiles/

/ServerFiles
FNA.dll
FNA.dll.config
Mono.Posix.dll
Mono.Security.dll
System.Configuration.dll
System.Core.dll
System.Data.dll
System.Drawing.dll
System.Numerics.dll
System.Runtime.Serialization.dll
System.Security.dll
System.Windows.Forms.dll
System.Windows.Forms.dll.config
System.Xml.Linq.dll
System.Xml.dll
System.dll
Terraria.png
TerrariaServer
--> TerrariaServer.bin.x86 <--
TerrariaServer.bin.x86_64
TerrariaServer.exe
WindowsBase.dll
changelog.txt
config.txt
lib
lib64
monoconfig
monomachineconfig
mscorlib.dll
open-folder
run.sh

我在StackOverflow上看到的其他答案都指出了权限冲突(出于测试目的,我自由地应用了chmod 777)和Windows行尾(Dockerfile和run.sh都是通过创建和编辑的nano(通过PuTTY)),但我所做的任何更改似乎都不会影响结果。

Dockerfile

FROM  ubuntu:latest

# Get wget package
RUN  apt-get update \
  && apt-get install -y wget \
  && apt-get install -y unzip \
  && rm -rf /var/lib/apt/lists/*

#RUN  apt-get install dos2unix

# Download and extract Terraria server files
RUN  pwd \
  && mkdir Downloads

RUN  cd Downloads \
  && wget -O "/Downloads/TServer.zip" http://terraria.org/server/terraria-server-1353.zip \
  && ls
RUN  unzip "/Downloads/TServer.zip" -d "/Downloads/TServer/"

# Extract the linux folder and delete old files/folders
RUN  cp -ra "/Downloads/TServer/1353/Linux/" "/ServerFiles/" \
  && rm -rf "/Downloads/TServer.zip" \
  && rm -rf "/Downloads/TServer/"

COPY run.sh /ServerFiles/run.sh
RUN chmod 777 /ServerFiles/run.sh

# Set the working directory
WORKDIR  "/ServerFiles/"
RUN ls
RUN chmod 777 .

RUN  chmod 777 TerrariaServer.bin.x86
RUN  adduser --disabled-password --gecos '' tserveruser \
  && adduser tserveruser sudo
RUN  chown -R tserveruser:tserveruser /ServerFiles
RUN  chown tserveruser:tserveruser /ServerFiles/TerrariaServer
USER  tserveruser

# Create the default config.txt
RUN printf "maxplayers=8\nport=7777\npassword=testpass\nworldpath=~/ServerFiles/Worlds/\ndifficulty=0\nautocreate=2\nworldname=World" \
  > config.txt

ENTRYPOINT ["./run.sh"]

2 个答案:

答案 0 :(得分:0)

黑暗中的刺伤...我能想到的唯一一件事是,使用您精心制作和提供的所有数据,可以解释您所看到的行为...

/ServerFiles/TerrariaServer.bin.x86是否可能是不指向现有文件的符号链接?这将同时产生您显示的清单和尝试运行该“文件”时出现的错误。也可能是它指向没有适当权限的文件。

如果不是那样,也许您应该执行“ ls -l”以查看是否碰巧提供了任何线索。

答案 1 :(得分:0)

使用已确认存在的二进制文件,此错误通常表示您已动态链接了映像内不存在的库。使用Shell运行您的映像,然后从那里检查ldd /ServerFiles/TerrariaServer.bin.x86来查看预期的库以及可能缺少的库。