我正在创建一个docker容器来运行haskell二进制文件。有问题的二进制文件是使用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将其链接到数据库。 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应用程序中的某处设置环境变量。到目前为止,我无法找到预期的位置或正确的环境变量。有谁知道我错过了什么?
答案 0 :(得分:1)
错误消息使其看起来像在当前工作目录(config/client_session_key.aes
)的相对路径中查找CWD
。是否像在WORKDIR
中指定Dockerfile
或在撰写YAML中将working_dir
指定为/opt/server
一样简单?
WORKDIR
有关在图片构建时设置默认CWD
的信息将为https://docs.docker.com/engine/reference/builder/#workdir。
有关在运行时设置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。