我试图在bash脚本(需要用户输入的交互式 shell )中使用Valve的steamcmd
包。当然,我希望能够作为Docker构建的一部分手动发送输入,但是我遇到了一些问题。
我首先在本地安装steamcmd
并运行以下脚本:
./steamcmd <<LOGIN
login anonymous
quit
LOGIN
毫不奇怪,它可以正常工作,并产生以下输出:
Steam Console Client (c) Valve Corporation
-- type 'quit' to exit --
Loading Steam API...OK.
Connecting anonymously to Steam Public...Logged in OK
Waiting for user info...OK
Steam>
当我在Docker中尝试相同的命令时,问题就开始了:
RUN ./steamcmd <<LOGIN \
login anonymous \
quit \
LOGIN
在构建过程中,它运行
./steamcmd
,但卡在输入提示上,Heredoc中的任何数据均未传递,并且构建从未完成。我究竟做错了什么?额外信息:
ubuntu:latest
最佳答案
Docker构建过程是完全非交互的,如果您正在寻找一些输入,则需要传递build-args,并在随后的RUN命令中引用这些build-args。
但是如建议中所述,您需要将它们作为CMD
运行,因为它将卡住构建过程。
这是Dockerfile和some example入口点,可能对您有帮助,
# start steamcmd to force it to update itself
RUN ./steamcmd/steamcmd.sh +quit
# start the server main script
ENTRYPOINT ["bash", "/home/steam/server_scripts/server.sh"]
您可以将其更改为
/home/steam/steamcmd/steamcmd.sh \
+login anonymous \
+exit
上面列表中的一个示例是
cs_go.sh
,您需要将其重命名为server.sh
是#!/bin/bash
# update server's data
/home/steam/steamcmd/steamcmd.sh \
+login anonymous \
+force_install_dir /home/steam/server_data \
+app_update 740 \
+exit
# start the server
/home/steam/server_data/srcds_run \
-game csgo -console -usercon \
-secure -autoupdate -tickrate 64 +hostport 27015 \
+game_type 0 +game_mode 1 +mapgroup mg_active +map de_dust2 \
-port 27015 -console -secure -nohltv +sv_pure 0 +ip 0.0.0.0
exit 0
已更新:
自动运行SteamCMD
有两种方法可以使SteamCMD自动化。 (在Linux / OS X上用
./steamcmd.sh
替换steamcmd。)命令行
注意:在命令行上使用-beta选项时,必须以特殊方式将其引号,例如
+app_update
“90 -beta beta”。注意:如果这不起作用,请尝试像
"+app_update 90 -beta beta"
一样放置它。将命令附加到以加号开头的命令行,例如:
steamcmd +login anonymous +force_install_dir ../csgo_ds +app_update 740 +quit
Automating SteamCMD
关于bash - Bash Heredoc似乎不适用于Docker RUN语句,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58674151/