Bash Heredoc似乎不适用于Docker RUN语句

时间:2019-11-02 18:39:00

标签: bash docker dockerfile

我试图在bash脚本中使用Valve的steamcmd包,bash脚本是需要用户输入的交互式外壳。当然,我希望能够作为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
  • 用户:非root用户

1 个答案:

答案 0 :(得分:1)

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