docker-stose和stdin上的用户输入

web*_*ars 5 linux stdin docker docker-compose

有人可以解释(并可能给出解决方法)以下docker-compose的行为吗?

给出以下文件:

Dockerfile

FROM alpine:3.8

COPY ./entrypoint.sh /entrypoint.sh

ENTRYPOINT [ "/entrypoint.sh" ]
Run Code Online (Sandbox Code Playgroud)

entrypoint.sh

#!/bin/sh

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

echo "Good ... PLOP is $PLOP"

exit 1
Run Code Online (Sandbox Code Playgroud)

泊坞窗,compose.yml

version: '3.7'

services:
  plop:
    tty: true
    stdin_open: true
    image: webofmars/plop:latest
Run Code Online (Sandbox Code Playgroud)

输出将如下:

1) ./entrypoint.sh

docker-stdin> ./entrypoint.sh
enter value here:
CASE1
Good ... PLOP is CASE1
Run Code Online (Sandbox Code Playgroud)

这似乎OK

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

enter value here: CASE2
Good ... PLOP is CASE2
Run Code Online (Sandbox Code Playgroud)

这似乎OK

3) docker-stdin> docker-compose run plop

enter value here: CASE3
Good ... PLOP is CASE3
Run Code Online (Sandbox Code Playgroud)

这似乎OK

4) docker-stdin> docker-compose up

Recreating docker-stdin_plop_1 ... done
Attaching to docker-stdin_plop_1 (last forever)
Run Code Online (Sandbox Code Playgroud)

这看起来很奇怪,适合我的用例

我错过了什么吗?

Edm*_*mhs 8

docker在stdin上撰写和用户输入

这是预期的行为。起来不是互动的。它可以启动多个容器,因此您不能有一个为多个容器打开了stdin的终端。

但是您可以使用docker-compose进行选择。

附加在其他窗口中,当您从docker-compose up开始时,可​​以添加-d参数,它将在后台启动该docker。

docker-compose up -d
Run Code Online (Sandbox Code Playgroud)

然后只需附加该泊坞窗并输入值

docker attach play_001_plop_1
Run Code Online (Sandbox Code Playgroud)

单行命令:

docker-compose up -d && docker attach play_001_plop_1
Run Code Online (Sandbox Code Playgroud)

  • 好吧,我确实知道 up 的目的不是交互式的,但解决方法不起作用,因为 docker-compose 文件应该由协调器(rancher 1.6)运行,而这种行为不在我们的控制之下。所以我想这是我们应该记住永远不要做交互式容器的事情,你应该依赖 ENV 变量。那么对于您不想更改的遗留应用程序来说,这个问题仍然很有趣。 (3认同)