Скрипт Dockerfile ENTRYPOINT: «Нет такого файла или каталога» в существующем файле - PullRequest
1 голос
/ 25 марта 2019

Я написал Dockerfile с намерением разместить игровой сервер в контейнере Docker, но сценарий оболочки ("run.sh"), который COPY'd в контейнер, не видит исполняемый файл ELF, это должен бежать.

Я настроил свой Dockerfile таким образом, чтобы он использовал последнюю версию пакета ubuntu, загружал и извлекал файлы игрового сервера в новую папку, а затем удалял архив .zip. Он успешно собирается, но когда я пытаюсь запустить его с помощью простого сценария оболочки, состоящего из трех строк:

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

pwd и ls подтверждают, что 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 голосов
/ 25 марта 2019

При наличии подтвержденного вами двоичного файла эта ошибка обычно означает, что у вас есть динамически связанные библиотеки, которых нет внутри образа.Запустите ваш образ с помощью оболочки и оттуда отметьте ldd /ServerFiles/TerrariaServer.bin.x86, чтобы увидеть, какие библиотеки ожидаются и, вероятно, отсутствуют.

0 голосов
/ 25 марта 2019

Удар в темноте ... единственное, что я могу придумать, это объяснить поведение, которое вы видите, учитывая все данные, которые вы так хорошо подготовили и предоставили ...

Является ли /ServerFiles/TerrariaServer.bin.x86 символической ссылкой, которая не указывает на существующий файл?Это приведет как к отображаемому вами списку, так и к ошибке, которую вы получите при попытке запустить этот «файл».Возможно также, что он указывает на файл без соответствующих разрешений.

Если это не так, возможно, вам следует выполнить команду "ls -l", чтобы проверить, дает ли это какие-либо подсказки.

...