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)
当我从命令行运行它时,它按预期工作
我试图使用docker容器和程序打印的第一个数字来实现相同的效果,然后在9秒后冻结并打印剩余的数字.
我的码头组成
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的缓冲输出有关.
首先,感谢您使用我的 perl6 docker 容器。我会用你的程序尝试一些事情,找出真正的问题所在。我猜你想知道,一般来说,这些类型的程序在 docker 中而不是在特定的 docker-compose 环境中会发生什么,对吧?
你可以这样做:
docker run -it --rm --entrypoint sh jjmerelo/alpine-perl6
Run Code Online (Sandbox Code Playgroud)
然后在容器内创建文件(cat > con例如使用)。我测试了一下,运行正常,没有任何问题。
你可以这样做:
docker run -it --rm -v $PWD:/app jjmerelo/alpine-perl6 /app/app.pl
Run Code Online (Sandbox Code Playgroud)
仍然没有问题,它每秒打印一个东西。它本身似乎并不是一个 docker 缓冲问题。让我们尝试更进一步
您在这里所做的是组合两个 docker 容器,您正在运行另一个容器。我们几乎已经确定 alpine-perl6 可能不会有问题。可以在phpdocker中吗?我的钱就在于此,虽然不清楚您使用的是哪个容器,但这个要点似乎指向实际使用 buffering 的容器。在更新的答案中,实际上并不是打印的时间,而是打印的字节数,足以填充缓冲区。尝试更改一下$x,"a good amount of bytes, including $x"看看是否是这样。
无论如何,我会像 @lizmat 所说的那样研究 phpdocker 容器的配置。此外,如果你想要的只是 cron,你可以按照这个建议,为 alpine 安装 cron,或者使用其他容器,例如这个
| 归档时间: |
|
| 查看次数: |
169 次 |
| 最近记录: |