我一直无法将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>
编译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中,它与我的SimpleHTTPServer
和elm-reactor
服务器上运行的端口相同。我已经研究了各种其他方法让Docker与Elm玩得很好,而且我遇到了困难。
有人有任何建议吗?
编辑:
已关闭 - 不确定我做了什么,但在完成并确保所有内容都已正确格式化后,它现在可以正常工作。我写原始代码时一定很累。谢谢大家!
答案 0 :(得分:0)
如果这是一个http服务器我想它应该在端口80上运行,当你指定端口8000意味着你暴露容器端口而不是主机端口时,你可以用任何一种方式进行端口映射
注意强>
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
)