在perl6中睡眠在docker-compose上无法正常工作

Dan*_*iel 7 sleep perl6 docker docker-compose

我写了一个简单的程序,它应该打印1到9之间的数字,等待1秒钟打印.

#!/usr/bin/env perl6

my $x = 1;
while $x < 10 {
    say $x++;
    sleep(1);
}
Run Code Online (Sandbox Code Playgroud)

当我从命令行运行它时,它按预期工作

视频1

我试图使用docker容器和程序打印的第一个数字来实现相同的效果,然后在9秒后冻结并打印剩余的数字.

视频2

我的码头组成

version: "3.1"
services:
    cron:
      build: phpdocker/cron
      container_name: docker-perl6
      volumes:
        - ./cron:/cron
      working_dir: /cron
      command: "app.pl"
Run Code Online (Sandbox Code Playgroud)

和Dockerfile

FROM jjmerelo/alpine-perl6
Run Code Online (Sandbox Code Playgroud)

版本

docker -v
Docker version 18.03.1-ce, build 9ee9f40

docker-compose -v
docker-compose version 1.15.0, build e12f3b9

perl6 -v
This is Rakudo version 2018.03-136-g768cf9f built on MoarVM version 2018.03-56-g85fc758
implementing Perl 6.c.
Run Code Online (Sandbox Code Playgroud)

更新

我换say $x++;say "{time}: {$x++}";

docker-perl6 | 1527933936: 1
docker-perl6 | 1527933937: 2
docker-perl6 | 1527933938: 3
docker-perl6 | 1527933939: 4
docker-perl6 | 1527933940: 5
docker-perl6 | 1527933941: 6
docker-perl6 | 1527933942: 7
docker-perl6 | 1527933943: 8
docker-perl6 | 1527933944: 9
Run Code Online (Sandbox Code Playgroud)

因此,@ elizabeth-mattijsen和@melpomene提到它与docker的缓冲输出有关.

jjm*_*elo 4

首先,感谢您使用我的 perl6 docker 容器。我会用你的程序尝试一些事情,找出真正的问题所在。我猜你想知道,一般来说,这些类型的程序在 docker 中而不是在特定的 docker-compose 环境中会发生什么,对吧?

从 docker 容器内部运行程序

你可以这样做:

docker run -it --rm  --entrypoint sh  jjmerelo/alpine-perl6
Run Code Online (Sandbox Code Playgroud)

然后在容器内创建文件(cat > con例如使用)。我测试了一下,运行正常,没有任何问题。

从 docker 容器外部运行程序

你可以这样做:

docker run -it --rm -v $PWD:/app  jjmerelo/alpine-perl6 /app/app.pl
Run Code Online (Sandbox Code Playgroud)

仍然没有问题,它每秒打印一个东西。它本身似乎并不是一个 docker 缓冲问题。让我们尝试更进一步

docker-compose 有问题吗?

您在这里所做的是组合两个 docker 容器,您正在运行另一个容器。我们几乎已经确定 alpine-perl6 可能不会有问题。可以在phpdocker中吗?我的钱就在于此,虽然不清楚您使用的是哪个容器,但这个要点似乎指向实际使用 buffering 的容器。在更新的答案中,实际上并不是打印的时间,而是打印的字节数,足以填充缓冲区。尝试更改一下$x"a good amount of bytes, including $x"看看是否是这样。

无论如何,我会像 @lizmat 所说的那样研究 phpdocker 容器的配置。此外,如果你想要的只是 cron,你可以按照这个建议,为 alpine 安装 cron,或者使用其他容器,例如这个