我尝试在 docker-compose 服务中为我的 haskell RPC 服务器代码进行自动重建和 rexecute 设置。该命令是一个带有 stack build --file-watch 的 bash 脚本(以及另一个在二进制文件发生变化时启动二进制文件的命令,但这有效)。问题是,无论我尝试什么, stack build --file-watch 命令都会失败并显示一个神秘的错误 <stdin>: hGetLine: end of file

我不明白为什么我会收到这个错误,特别是因为如果我使用 docker-compose run bd-service bash -l -c "./bd-service/compile_hs_and_run.sh" 运行相同的命令,它会按预期工作。我相信这是执行 docker-compose up 时如何处理 bash 的问题,而不是堆栈本身的问题,但我承认我一无所知。

另请注意:

  • 删除 --file-watch 选项使脚本工作
  • 用 --file-watch-poll 替换 --file-watch 不会改变任何东西

  • 这是服务定义:
      # 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
    
    

    这是相关的 dockerfile:
    # 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
    

    最佳答案

    我的问题的一个简单解决方法是通过管道将 cat 连接到堆栈构建 --file-watch。
    我从堆栈交换的这个线程中得到了启发: https://unix.stackexchange.com/a/103893

    因此,用 stack build --verbose --file-watch 替换 cat | stack build --verbose --file-watch 就像一个魅力。我确实觉得这在某种程度上并不“正常”,但无论如何......

    让它工作的东西实际上是 docker-compose.yml 中的 stdin_open: true 选项,管道 cat 命令没有做任何事情......

    关于bash - 在 docker-compose 命令中运行 stack build --file-watch 时如何修复 "<stdin>: hGetLine: end of file",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58482221/

    10-16 16:56