首页 > 解决方案 > 在 docker 容器中输入的 Shell 脚本

问题描述

我有一个server-setup.sh在 docker 容器中运行的 .sh 脚本 () 提出问题并等待用户在控制台中写一些东西。我使用read将用户输入写入变量的函数,然后使用一些“if”,它根据用户输入执行某些操作。

当容器启动时,它会entrypoint.sh立即调用server-setup.sh. 脚本启动,但输入一个空的输入,所以脚本退出。

server-setup.sh


    echo "Select server type\n "
    echo " 1) Vanilla\n 2) Paper\n 3) Forge\n 4) Mohist\n 5) Quit"
    read server_type_num
    if [ "$server_type_num" = "1" ]; then
      server_type="Vanilla"
      server_ver_select
    elif [ "$server_type_num" = "2" ]; then
      server_type="PaperMC"
      server_ver_select
    elif [ "$server_type_num" = "3" ]; then
      server_type="Forge"
      #server_ver_select
      echo "Working on..."
    elif [ "$server_type_num" = "4" ]; then
      server_type="Mohist"
      #server_ver_select
      echo "Working on..."
    elif [ "$server_type_num" = "5" ]; then
      echo "Bye!"
      return
    else
      echo "Invalid option"
      echo "Option: $server_type_num"
      return
    fi

结果:

    Select server type
     1) Vanilla
     2) Paper
     3) Forge
     4) Mohist
     5) Quit
    Invalid option
    Option:

版本:

Docker version: 20.10.6

Docker is running on: Ubuntu Server (Focal 20.04 LTS)

Container image: Ubuntu

标签: dockershell

解决方案


虽然在 a 中有一个交互式入口点不是一个好习惯,Dockerfile但没有提示您输入的原因是因为 docker 不会在交互式模式下运行,除非您使用-it标志请求它。

$ docker run --help
  # ...
  -t, --tty           Allocate a pseudo-TTY
  -i, --interactive   Keep STDIN open even if not attached

因此,您可以运行:

$ docker run --rm -it your_image ...

更好的选择是使用环境变量。例如:

#!/usr/bin/env sh
server_ver_select() {
  echo "Server is $server_type"
}

server_type="${SERVER_TYPE:-Vanilla}"
server_ver_select

并运行:

$ docker run --rm -it -e SERVER_TYPE=PaperMC temp

推荐阅读