Yesod部署的Dockerfile

我正在使用一个Yesod应用程序,我想用Docker进行部署。 我正在使用stack进行构build,并且应用程序按照预期在使用stack exec -- yesod devel进行本地交互时正常工作。 我现在想把它放在远程服务器上,使用Docker进行部署。

我意识到我也可以

  1. 让Dockerfile编译编译并在本地构build
  2. 把二进制文件放到一个Docker镜像中,将镜像推送到一个仓库,然后拉到服务器。

假设去的路线#2,我有以下的Dockerfile:

 FROM haskell:7.10 MAINTAINER stevejb <stevejb> RUN mkdir /yesodapp COPY config /yesodapp/config COPY static /yesodapp/static COPY ./.stack-work/dist/x86_64-linux/Cabal-1.22.4.0/build/sjb-app/sjb-app /yesodapp/sjb-app EXPOSE 3000 ENTRYPOINT ["/yesodapp/sjb-app"] 

但是,这并没有做任何事情。 当我尝试从容器内手动启动应用程序时,它不会执行任何操作。 我想我在这里错过了一些简单的东西。


stack.yaml

 image: container: name: stevejb/sjb-app base: fpco/stack-run add: config: /app/config static: /app/static 

然后,

 $ stack image container Sending build context to Docker daemon 30.08 MB Sending build context to Docker daemon Step 0 : FROM fpco/stack-run ---> db9b2a858ef5 Step 1 : ADD ./ / ---> 69d4ae832c0e Removing intermediate container 4c6dd4edc16d Successfully built 69d4ae832c0e $ $ docker run --rm -p 3000:3000 stevejb/sjb-app *** Running /etc/my_init.d/00_regen_ssh_host_keys.sh... *** Running /etc/rc.local... *** Booting runit daemon... *** Runit started as PID 17 *** Running sudo -EHu root PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin /usr/bin/env -- bash... *** sudo exited with status 0. *** Shutting down runit daemon (PID 17)... *** Killing all processes... 

另外,我注意到这不会生成一个Dockerfile 。 是手工制作的yesodweb dockerfile吗?

首先猜测是你需要把你的工作目录/yesodapp

由于您已经在使用Stack,因此您可能有兴趣尝试Docker容器生成function。 一个例子是在yesodweb.com代码库中 。 在stack.yaml文件中,我们有:

 resolver: lts-3.0 image: container: name: snoyberg/yesodweb base: fpco/stack-run add: config: /app/config static: /app/static 

然后运行stack image container生成一个snoyberg/yesodweb图像。

您可能也有兴趣查看我用于yesodweb.com的Kubernetes部署脚本 。