使用docker-compose up和用户在标准输入上的输入

23

有人能解释一下docker-compose的以下行为(并提供解决方法)吗?

给出以下文件:

Dockerfile

FROM alpine:3.8

COPY ./entrypoint.sh /entrypoint.sh

ENTRYPOINT [ "/entrypoint.sh" ]

entrypoint.sh

#!/bin/sh

until [ ! -z "$PLOP" ]; do
    echo -n 'enter value here: '
    read PLOP
done

echo "Good ... PLOP is $PLOP"

exit 1

docker-compose.yml

version: '3.7'

services:
  plop:
    tty: true
    stdin_open: true
    image: webofmars/plop:latest

输出将会是以下内容:

1) ./entrypoint.sh

docker-stdin> ./entrypoint.sh
enter value here:
CASE1
Good ... PLOP is CASE1

看起来不错

2) docker-stdin> docker run -it webofmars/plop

enter value here: CASE2
Good ... PLOP is CASE2

看起来不错

3) docker-stdin> docker-compose run plop

enter value here: CASE3
Good ... PLOP is CASE3

似乎OK

4) docker-stdin> docker-compose up

Recreating docker-stdin_plop_1 ... done
Attaching to docker-stdin_plop_1 (last forever)

这似乎对我的使用情况来说相当奇怪和不合适

我有遗漏什么吗?

1个回答

30

Docker Compose启动并在标准输入(stdin)上接收用户输入的行为是正常的。

这是预期的行为。 up不是交互式的。它可以启动多个容器,因此您不能有一个单独的终端打开多个容器的stdin。

但是,使用docker-compose有一种选项。

在不同的窗口中附加,当您使用docker-compose up启动时,您可以添加-d参数,它将在后台启动该docker。

docker-compose up -d

然后只需附加该 docker 并输入值

docker attach play_001_plop_1

单行命令:

docker-compose up -d && docker attach play_001_plop_1

3
好的,我确实明白up不是为交互而设计的,但是这种解决方法行不通,因为docker-compose文件应该由编排器(rancher 1.6)运行,这种行为不在我们的控制范围内。所以我想这是我们应该记住的事情,永远不要做交互式容器,你应该依赖于环境变量。那么对于您不想更改的旧应用程序来说,这个问题仍然很有趣。 - webofmars

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接