如何为Yesod编写Dockerfile? “RUN yesod init -n myApp -d postgresql”没有按预期工作

时间:2015-06-30 14:13:05

标签: docker yesod dockerfile docker-compose

我尝试使用Docker Compose使用Yesod和PostgreSQL创建一个简单的应用程序,但RUN yesod init -n myApp -d postgresql似乎没有按预期工作。 我将Dockerfile和docker-compose.yml定义如下:

Dockerfile:

FROM shuny/ghc-7.8.4:latest

MAINTAINER shuny

# Create default config
RUN cabal update
# Add stackage remote repo
RUN sed -i 's/^remote-repo: [a-zA-Z0-9_\/:.]*$/remote-repo: stackage:http:\/\/www.stackage.org\/lts/g' /root/.cabal/config
# Update packages
RUN cabal update
# Generate locale otherwise happy (because of tf-random) will fail
RUN locale-gen en_US.UTF-8
ENV LANG en_US.UTF-8
RUN echo $LANG
# Install build tools for yesod
RUN cabal install alex happy yesod-bin
# Install library for yesod-postgres
RUN apt-get update && apt-get install -y libpq-dev
RUN mkdir /code
WORKDIR /code
RUN yesod init -n myApp -d postgresql
WORKDIR /code/myApp
RUN cabal sandbox init && cabal install --only-dependencies --max-backjumps=-1 --reorder-goals
RUN cabal configure && cabal build && cabal install
ADD . /code
WORKDIR /code
# ADD settings.yml /code/myApp/config/

搬运工-compose.yml:

database:
    image: postgres
    ports:
      - "5432"

web:
    build: .
    tty: true
    command: yesod devel
    volumes:
        - .:/code/
    ports:
        - "3000:3000"
    links:
        - database

docker-compose build返回如下:

Step 0 : FROM shuny/ghc-7.8.4:latest
...
Step 17 : WORKDIR /code
---> Running in bf99d0aca48c
---> 37c3c94338d7
Removing intermediate container bf99d0aca48c
Successfully built 37c3c94338d7

但是当我这样检查时:

$docker-compose run web /bin/bash
root@0fe5fb1a3b20:/code# ls
root@0fe5fb1a3b20:/code# 

它没有显示任何内容,而这些命令似乎按预期工作:

docker run -ti 37c3c94338d7
root@31e94428de37:/code# ls
docker-compose.yml  Dockerfile  myApp  settings.yml
root@31e94428de37:/code# ls myApp/
app                   config         Handler    Model.hs     Settings.hs  test
Application.hs        dist           Import     myApp.cabal  static
cabal.sandbox.config  Foundation.hs  Import.hs  Settings     templates

我该如何解决? 我真的应用任何反馈,谢谢。

1 个答案:

答案 0 :(得分:0)

您正在使用卷和ADD指令进行奇怪的操作。

首先在图像中构建应用程序:

RUN yesod init -n myApp -d postgresql
WORKDIR /code/myApp
RUN cabal sandbox init && cabal install --only-dependencies --max-backjumps=-1 --reorder-goals
RUN cabal configure && cabal build && cabal install

然后在图像的Dockerfile文件夹中添加包含/code的文件夹的内容。我猜这一步没用。

ADD . /code

然后,如果您运行没有-volume选项的容器,一切正常

docker run -ti 37c3c94338d7

但是在docker-compose.yml文件中,您指定了一个卷选项,该选项覆盖容器中的/code文件夹,其中包含主机上包含docker-compose.yml文件的文件夹。因此,您不再拥有在构建图像期间生成的内容。

有两种可能性:

  • 请勿使用docker-compose.yml文件
  • 中的音量指令
  • 将图片的/code/myApp/文件夹的内容放在主机的./myApp文件夹中。

这取决于您希望在docker-compose.yml中使用音量选项的原因。

我真的不知道你的目标是什么。但是,如果你要做的是从主机访问容器内部构建的文件,那么这可能就是你想要的:

  • 从Dockerfile中删除构建步骤
  • 在" web"内运行shell。容器:docker-compose run web bash
  • 启动构建命令

因此,您将在安装卷时构建应用程序,并在主机上查看文件。

  • 退出shell
  • 正常启动Docker撰写

如果您只想备份/code/myApp/文件夹的内容,可能应该从docker-compose.yml的volume部分省略主机上的路径。

volumes:
    - /code/

然后关注this section of the documentation

我希望它有所帮助