Как исправить «<stdin>: hGetLine: конец файла» при запуске сборки стека --file-watch в команде docker-compose - PullRequest
3 голосов
/ 21 октября 2019

Я пытаюсь выполнить автоматическую перестройку и повторную настройку для кода моего RPC-сервера haskell в сервисе docker-compose. Команда представляет собой bash-скрипт с stack build --file-watch (и другой командой для запуска двоичного файла, когда он изменяется, но это работает). Проблема в том, что, независимо от того, что я пытаюсь, команда stack build --file-watch завершается ошибкой с загадочной ошибкой <stdin>: hGetLine: end of file.

Я не понимаю, почему я получаю эту ошибку, особенно потому, что если я запускаю ту же команду, используяdocker-compose run bd-service bash -l -c "./bd-service/compile_hs_and_run.sh", работает как положено. Я полагаю, что это проблема того, как обрабатывается bash при выполнении docker-compose up, а не проблема самого стека, но я признаю, что я не в курсе.

Также обратите внимание, что:

  • удаление опции --file-watch делает скрипт работоспособным
  • замена --file-watch на --file-watch-poll ничего не меняет

Это определение сервиса:

  # this is my service definition in docker-compose.yml
  bd-service:
    build:
      context: '.'
      dockerfile: 'dockerfiles/bd_heroku_service.Dockerfile'
      args:
        UID: "$UID"
    command:  bash -l -c "./bd-service/compile_hs_and_run.sh"
    user: "$UID"
    volumes:
      - .:/app/user

Это соответствующий файл docker:

# Inherit from bd_heroku_node image
FROM bd_heroku_node

ENV LANG en_US.UTF-8
# Stack stores binaries in /root/.local/bin
ENV PATH /root/.local/bin:$PATH

# Heroku assumes we'll put everything in /app/user
RUN mkdir -p /app/user/bd-service
WORKDIR /app/user

USER root

ARG STACK_VERSION=2.1.3
RUN wget -qO- https://github.com/commercialhaskell/stack/releases/download/v$STACK_VERSION/stack-$STACK_VERSION-linux-x86_64.tar.gz | tar xz --wildcards --strip-components=1 -C /usr/local/bin '*/stack'
USER appuser
# . here means the entire bd-bootstrap repo, context should be set accordingly (to bd-bootstrap)
RUN stack setup --resolver lts-14.10;

USER appuser
RUN mkdir -p /app/user/bd-common
RUN mkdir -p /app/user/bd-service

COPY bd-common/*.yaml /app/user/bd-common/

RUN cd /app/user/bd-common; stack build --only-dependencies;

RUN stack install fswatcher;

А затем мой bash-файл compile_hs_and_run:

#! /bin/bash
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

cd $DIR
echo "We are at "
pwd
echo "start";

stack build --verbose --file-watch

# The next command is commented because it works :
# /app/.local/bin/fswatcher --path /app/user/bd-service/.stack-work/install stack run bd-service-exe &


echo "it's over"

При запуске с docker-compose up bd-service не удается с этими журналами:

bd-service_1       | We are at 
bd-service_1       | /app/user/bd-service
bd-service_1       | start
bd-service_1       | Version 2.1.3, Git revision 0fa51b9925decd937e4a993ad90cb686f88fa282 (7739 commits) x86_64 hpack-0.31.2
bd-service_1       | 2019-10-21 07:23:02.631167: [debug] Checking for project config at: /app/user/bd-service/stack.yaml
bd-service_1       | 2019-10-21 07:23:02.634794: [debug] Loading project config file stack.yaml
bd-service_1       | 2019-10-21 07:23:02.641395: [error] <stdin>: hGetLine: end of file
bd-service_1       | it's over

1 Ответ

0 голосов
/ 23 октября 2019

Простой обходной путь для моей проблемы - это направить cat в стек стека --file-watch. Меня вдохновила эта тема по обмену стека: https://unix.stackexchange.com/a/103893.

Таким образом, замена stack build --verbose --file-watch на cat | stack build --verbose --file-watch работает как шарм. Я чувствую, что в некоторой степени это не «нормально», но как бы то ни было ...

То, что заставило его работать, на самом деле - это опция stdin_open: true в docker-compose.yml, передающаяcat команда ничего не делала ...

...