yesod 二进制文件期望在哪里找到配置文件夹?

Where do yesod binaries expect to find the config folder?

问题描述

我正在为 运行 haskell 二进制文件创建一个 docker 容器。有问题的二进制文件是一个用 yesod 构建的网站。当容器启动时,它看起来很有希望,但随后失败:

config/client_session_key.aes: openBinaryFile: does not exist (No such file or directory)

重建步骤

二进制文件的 Dockerfile 非常基础。它看起来像这样:

FROM haskell:7.10.3
MAINTAINER Garry Cairns
ENV REFRESHED_AT 2015-09-05

RUN ["apt-get", "-y", "update"]
RUN ["apt-get", "-y", "install", "libpq-dev"]

我使用 docker-compose 将其 link 写入数据库。 docker-compose 文件如下所示:

version: "2.0"
services:
  database:
    image: postgres
    env_file: ./database/env
  binary:
    build: ./binary
    command: /opt/server/api
    env_file: ./api/env
    links:
      - database
    tty: false
    volumes:
      - /etc/ssl/certs/:/etc/ssl/certs/
      - ./binary:/opt/server/

二进制文件的 volumes 行特别重要,因为它将二进制文件及其静态和配置目录加载到容器中。我已经检查过它们确实存在并且确实存在,所以容器文件结构最终看起来像这样:

/opt/server
    binary_file
    /static
        ...
    /config
        client_session_key.aes
        ...

连接到数据库似乎正常工作,因为我在日志记录中看到了这样的行

binary_1   | Migrating: ALTER TABLE "blog" ALTER COLUMN "title" TYPE varchar(50)

在我看到错误消息之前。

问题

我怀疑我需要将配置文件夹移动到二进制文件期望找到它的其他位置,或者在构建它之前在 yesod 应用程序的某处设置环境变量。到目前为止,我一直找不到预期的位置或要设置的正确环境变量。有谁知道我错过了什么?

该错误消息使其看起来像是在当前工作目录 (CWD) 的相对路径中寻找 config/client_session_key.aes。是不是像在 Dockerfile 中指定 WORKDIR 或在撰写 YAML 中指定 working_dir/opt/server 一样简单?

关于 WORKDIR 在图像构建时设置默认值 CWD 的信息将在 https://docs.docker.com/engine/reference/builder/#workdir

有关在运行时设置 Compose working_dir 的信息位于 https://docs.docker.com/compose/compose-file/#cpu-shares-cpu-quota-cpuset-domainname-hostname-ipc-mac-address-mem-limit-memswap-limit-privileged-read-only-restart-stdin-open-tty-user-working-dir