如何从docker容器运行yesod init?

我正在努力实现的

我想用Haskell和Yesod开发个人网站。 我以前的网页工作主要是Python。 我使用Docker,这样一旦完成任务,我就可以轻松地在Amazon Web Services上进行部署。 我在容器中进行所有的开发 – 所以除了像vim和git这样的工具之外,没有软件直接安装在我的机器上,那么只需部署容器。 我想为这个网站做同样的事情。

我试过了

我的Dockerfile目前看起来像这样:

FROM haskell:latest MAINTAINER Garry Cairns ENV REFRESHED_AT 2015-03-19 # create a haskell user to run our programs # ADD must be after chown see http://stackoverflow.com/a/26145444/1281947 RUN ["groupadd", "haskell"] RUN ["useradd", "haskell", "-s", "/bin/bash", "-m", "-g", "haskell", "-G", "haskell"] ENV HOME /home/haskell RUN ["mkdir", "/home/haskell", "-p"] WORKDIR /home/haskell RUN ["chown", "-R", "haskell:haskell", "/home/haskell"] ADD ./ /home/haskell # install yesod RUN ["apt-get", "install", "-y", "wget"] RUN ["wget", "http://www.stackage.org/lts/cabal.config"] RUN ["cabal", "update"] RUN ["cabal", "install", "yesod"] # uncomment the line below to use container as a non-root user # USER haskell:haskell 

安装yesod注释下的说明来自yesod快速入门指南 。 容器build立,但在cabal update步骤时,我看到一个警告:

 Config file path source is default config file. Config file /home/haskell/.cabal/config not found. Writing default configuration to /home/haskell/.cabal/config Downloading the latest package list from hackage.haskell.org Note: there is a new version of cabal-install available. To upgrade, run: cabal install cabal-install 

这可能会或可能不会与后面的错误有关。

我使用sudo docker run -itv /home/garry/projects/personal/api/:/home/haskell garrycairns/haskell /bin/bash在此容器上运行shell会话,并尝试使用yesod init ,它告诉我找不到yesod命令。 运行ghci不让我import Yesod

无论我安装yesod还是yesod-bin,结果都是一样的。

我也尝试以haskell用户(见我的Dockerfile)运行相同的结果。

预期结果

运行yesod init应该按照快速入门指南中的描述来支持我的应用程序。

实际结果

yesod命令在我的容器中不可用。

我在问什么

我如何设置一个Docker容器,让我运行yesod init ,之后, yesod devel

您需要将位置~/.cabal/bin/到您的path以访问由cabal安装的程序,如yesod。

其次,作为haskell用户运行cabal可能会更好,因为它预计会由非root用户运行(这可能会阻止你在ghci中加载文件)。

最后,在主文件夹的子文件夹中开发可能会更好,因为cabal沙盒将添加隐藏文件。

你也可能想为你安装系统库数据库等

以下文件似乎工作:

 FROM haskell:latest MAINTAINER Garry Cairns ENV REFRESHED_AT 2015-03-19 # create a haskell user to run our programs # ADD must be after chown see http://stackoverflow.com/a/26145444/1281947 RUN ["groupadd", "haskell"] RUN ["useradd", "haskell", "-s", "/bin/bash", "-m", "-g", "haskell", "-G", "haskell"] ENV HOME /home/haskell RUN ["mkdir", "/home/haskell", "-p"] WORKDIR /home/haskell RUN ["chown", "-R", "haskell:haskell", "/home/haskell"] ADD ./ /home/haskell # install wget RUN ["apt-get", "install", "-y", "wget"] # set up haskell USER haskell:haskell # add cabal installed programs to path ENV PATH /home/haskell/.cabal/bin:$PATH # enter working directory RUN ["mkdir", "yesod"] WORKDIR /home/haskell/yesod # install yesod binary RUN ["wget", "http://www.stackage.org/lts/cabal.config"] RUN ["cabal", "update"] RUN ["cabal", "install", "alex", "happy", "yesod-bin"] 

我结束了以下。

下载全局堆栈configuration文件并将其保存在我的项目根目录中作为stackage

构build下面的Dockerfile,它使用我们刚刚创build的stackage文件,直到我说其他评论的地方。

 FROM haskell:7.8 # install database dependencies RUN ["apt-get", "update"] RUN ["apt-get", "-y", "install", "libpq-dev"] # update cabal and install yesod RUN cabal update ADD ./stackage /root/.cabal/stackage RUN cat /root/.cabal/config /root/.cabal/stackage > /root/.cabal/config2 RUN ["mv", "/root/.cabal/config2", "/root/.cabal/config"] RUN cabal update RUN ["cabal", "install", "yesod-bin", "-j4"] # Add your .cabal file before the rest of the code so next step caches # Comment out here on the first run ADD ./myproject.cabal /opt/server/myproject.cabal # Docker will cache this command as a layer, freeing us up to # modify source code without re-installing dependencies RUN cd /opt/server && cabal install --only-dependencies -j4 # Add and Install Application Code ADD ./ /opt/server RUN cd /opt/server && cabal install # Add installed cabal executables to PATH ENV PATH /root/.cabal/bin:$PATH # Default directory for container WORKDIR /opt/server 

使用项目根目录作为卷运行新的容器,然后在容器内运行yesod init --bare 。 这也将在主机上的项目根目录下创build它的文件。

取消注释上述Dockerfile中的注释并重新构build。 你现在有一个工作的Dockerfile。