我尝试使用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
我该如何解决? 我真的应用任何反馈,谢谢。
答案 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
中使用音量选项的原因。
我真的不知道你的目标是什么。但是,如果你要做的是从主机访问容器内部构建的文件,那么这可能就是你想要的:
docker-compose run web bash
因此,您将在安装卷时构建应用程序,并在主机上查看文件。
如果您只想备份/code/myApp/
文件夹的内容,可能应该从docker-compose.yml的volume
部分省略主机上的路径。
volumes:
- /code/
然后关注this section of the documentation
我希望它有所帮助