无法Dockerize Elm

时间:2018-04-22 00:05:59

标签: javascript html docker functional-programming elm

我一直无法将Elm应用程序停靠。据我所知,我已经创建了一个完整且有效的Docker文件......但它不起作用。

我会解释。

所以我的脚本在3个文件中运行。

首先是开始脚本dockerBuild.sh

docker stop $(docker ps -aq)
docker rm $(docker ps -aq)
docker rmi $(docker images -q)

docker build -t elmapp .
docker run -p 8000:8000 elmapp

这只会杀死所有以前的泊坞窗图像并构建并运行elmapp

接下来,我正在调用我的Dockerfile

FROM node:latest

RUN npm install -g yarn
RUN yarn global add elm

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY . /usr/src/app
RUN chmod 777 runElm.sh

EXPOSE 8000
CMD sh runElm.sh

这会生成所需的输出并运行runElm.sh

我设置runElm文件有两种替代方法 - 它们都产生相同的结果。

  • 备选方案1

    elm-reactor --address=0.0.0.0 --port=8000

这只是在以下html文件上调用elm-reactor

<!DOCTYPE HTML>
<html>
<head>
  <link rel="stylesheet" href="style.css">
  <script src="/_compile/src/Main.elm"></script>
  <style>
    body, html{
      height: 100%;
      width: 100%;
      margin: 0;
      padding: 0;
    }
  </style>
</head>
<body>
  <script>
    var app = Elm.Main.fullscreen()
  </script>
</body>
</html>
  • 备选方案2

编译Elm应用程序的另一种可能方法是将代码转换为javascript并在html doc中运行javascript。这里的runElm文件是这样的:

elm-make ./src/Main.elm --output=main.js
python -m SimpleHTTPServer 8000

html看起来像这样:

<!DOCTYPE HTML>
<html>

  <head>
    <meta charset="UTF-8">
    <title>Elm • Play</title>
    <link rel="stylesheet" href="style.css">
    <style>
      body, html{
        height: 100%;
        width: 100%;
        margin: 0;
        padding: 0;
      }
    </style>
  </head>

  <body>
    <div id="main"></div>
  </body>

  <script type="text/javascript" src="./src/main.js"></script>
  <script>
    var node = document.getElementById('main');
    var app = Elm.Main.embed(node);
  </script>

</html>

问题:

这里的问题是,当我的构建队列完成后导航到localhost:8000时,我得到404.但是,如果我在Dockerfile中运行上述两个替换中的任何一个,我得到了我的程序编译得很好。通常问题是端口没有正确暴露,但在这里我暴露了我的dockerfile中的端口8000,在我的docker run中,它与我的SimpleHTTPServerelm-reactor服务器上运行的端口相同。我已经研究了各种其他方法让Docker与Elm玩得很好,而且我遇到了困难。

有人有任何建议吗?

编辑:

已关闭 - 不确定我做了什么,但在完成并确保所有内容都已正确格式化后,它现在可以正常工作。我写原始代码时一定很累。谢谢大家!

3 个答案:

答案 0 :(得分:0)

如果这是一个http服务器我想它应该在端口80上运行,当你指定端口8000意味着你暴露容器端口而不是主机端口时,你可以用任何一种方式进行端口映射

  1. 就像你做的那样,并且会映射容器上的端口8000 到主机上的随机端口。
  2. 您可以通过添加用于创建的cmd来指定 容器-p 8000:80,8000在主机上,80在容器上
  3. 注意

    EXPOSE指令通知Docker在启动容器时要暴露某个端口:

      

    EXPOSE port1 port2 ...

    即使在暴露端口之后,在启动容器时,仍然需要使用-p标志提供端口映射到“docker run”cmd。如果要将容器公开端口映射到自定义主机端口

    ,此指令很有用

    port命令查找绑定到公开端口的面向公众的端口 容器中的端口:

      

    $ docker port CONTAINER PRIVATE_PORT

    如果你想知道哪个绑定到容器端口运行以下

      

    docker port CONTAINER

答案 1 :(得分:0)

默认情况下,elm-reactor在localhost上侦听,而不是所有接口。这可能会阻止您从容器外部到达它,请尝试:elm-reactor -a 0.0.0.0

答案 2 :(得分:0)

如果您获得404,则表示Web服务器正在运行,但无法找到您请求的文件。因此,请确保您的路径正确,并检查Web服务器的输出(docker logs YOURCONTAINERNAME