使用docker-compose
时,我注意到了奇怪的行为。
Console.ReadLine()
不等待用户输入。
观察以下简化的点网核心c#控制台应用程序:
private static void Main(string[] args)
{
Console.WriteLine("Input something:");
while (true)
{
var line = Console.ReadLine();
Console.WriteLine($"{DateTime.Now} Input was: {line}");
System.Threading.Thread.Sleep(1000);
}
}
如果您通过docker run -i readline
运行此程序,则效果很好:
但是,如果您使用docker-compose up
,它将循环播放而无需等待STDIN上的输入:
那是为什么?
您可以使用以下方法自己尝试:
git clone https://github.com/mh-qUjB/docker-dotnetcore-readline.git
cd ./docker-dotnetcore-readline/ReadLine
docker-compose up
我正在对此进行测试:
Ubuntu 16.04
Docker version 18.06.1-ce, build e68fc7a
docker-compose version 1.22.0, build f46880fe
<TargetFramework>netcoreapp2.1</TargetFramework>
谢谢。
PS:如果您可以改善这个问题的标题,我会很高兴的。
答案 0 :(得分:2)
您可以找到单个容器并在该容器中执行命令。 Docker compose正在流式传输您的日志,因此,它不为您提供交互式外壳。
例如,假设您有此撰写文件,
function calculate(time) {
// split string into words
let times = time.split(/\s+/);
let totalMinutes = 0;
while (times.length > 0) {
// get quantity from number in pair
let quantity = Number(times.shift());
// get unit of measurement from pair
let unit = times.shift();
let multipler;
if (/day/.test(unit)) {
// there are 60 * 24 minutes in a day
multipler = 60 * 24;
} else if (/hour/.test(unit)) {
// there are 60 minutes in an hour
multipler = 60;
} else { // assuming minute
// there's 1 minute in a minute
multipler = 1;
}
// add to the total amount of minutes
totalMinutes += quantity * multipler;
}
return totalMinutes;
}
console.log(calculate('1 hour 5 mins')); // 65
console.log(calculate('2 hours 1 min')); // 121
console.log(calculate('3 hours')); // 180
console.log(calculate('10 mins')); // 10
console.log(calculate('1 day 5 hours')); // 1740
console.log(calculate('2 days 15 hours')); // 3780
console.log(calculate('3 days 16 hours 32 mins')); // 5312
console.log(calculate('2 hours')); // 120
console.log(calculate('1 day')); // 1440
您可以在以下容器中执行命令
version: '3'
services:
nats:
image: nats-streaming
mongo:
image: mongo