Sleep в perl6 не работает правильно на Docker-Compose - PullRequest
0 голосов
/ 02 июня 2018

Я написал простую программу, которая должна печатать цифры от 1 до 9, ожидая 1 секунду между печатью.

#!/usr/bin/env perl6

my $x = 1;
while $x < 10 {
    say $x++;
    sleep(1);
}

Она работает, как и ожидалось, когда я запускаю ее из командной строки

Видео 1

Я пытался добиться того же эффекта, используя докер-контейнер и запрограммировал первую цифру, затем заморозил на 9 секунд и напечатал остальные цифры.

Видео 2

Мой docker-compose

version: "3.1"
services:
    cron:
      build: phpdocker/cron
      container_name: docker-perl6
      volumes:
        - ./cron:/cron
      working_dir: /cron
      command: "app.pl"

и Dockerfile

FROM jjmerelo/alpine-perl6

Версии

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.

Обновление

Я изменил 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

Так как, как упоминали @ elizabeth-mattijsen и @melpomene, это проблема, связанная сбуферизация вывода докером.

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Как уже говорили другие, кеширование вызвано перенаправлением, которое вы используете.Вручную вы можете запустить контейнер в интерактивном режиме, например:

docker run -it --rm author/image-name

Важной частью являются ключи -it:

--interactive , -i      Keep STDIN open even if not attached
--tty , -t              Allocate a pseudo-TTY

Хотя docker-compose run по умолчанию назначает tty, большинство докеров-составлять команды нет.Посмотрите конфигурацию docker-compose.yaml для добавления этих опций, если они вам действительно нужны (в 99% случаев, когда вы этого не делаете), в частности stdin_open и tty.

0 голосов
/ 02 июня 2018

Во-первых, спасибо за использование моего док-контейнера perl6.Я попробую несколько вещей с вашей программой, чтобы выяснить, в чем действительно проблема.Я так понимаю, вы хотите знать, в целом, что происходит с такими программами в Docker, а не в конкретной среде Docker-compose, верно?

Запустите программу из контейнера Docker

Вы можете сделать это:

docker run -it --rm  --entrypoint sh  jjmerelo/alpine-perl6

и затем создать файл внутри контейнера (например, используйте cat > con).Я проверил это, и он работает правильно, никаких проблем.

Запустите программу из-за предконтрольного контейнера

Вы можете сделать это:

docker run -it --rm -v $PWD:/app  jjmerelo/alpine-perl6 /app/app.pl

По-прежнему никаких проблем, она печатает данные одну секунду.Похоже, что это не проблема буферизации докера.Давайте попробуем пойти немного дальше

Проблемы с docker-compose?

То, что вы здесь делаете, это создание двух контейнеров docker, вы запускаете один контейнер из другого.Мы в значительной степени установили, что у alpine-perl6 может не быть проблем.Может ли это быть в phpdocker ?Мои деньги на это, хотя и не ясно, какой контейнер вы используете, эта суть, кажется, указывает на тот контейнер, фактически использующий буферизацию .В обновленном ответе на самом деле печатается не время, а количество печатаемых байтов, достаточное для заполнения буфера.Попробуйте изменить $x на "a good amount of bytes, including $x", чтобы увидеть, так ли это.

В любом случае, я бы посмотрел на конфигурацию контейнера phpdocker, как говорит @lizmat.Кроме того, если вам нужен только cron, вы можете следовать этому совету , установить cron для alpine или использовать другие контейнеры, такие как этот

...