从 docker 容器内运行 sbt 项目
Posted
技术标签:
【中文标题】从 docker 容器内运行 sbt 项目【英文标题】:running sbt project from inside docker container 【发布时间】:2022-01-09 06:18:37 【问题描述】:我有一个项目,在本地运行时,输出server started at /127.0.0.1:5000
,我可以在该端口上本地访问它。
我正在尝试通过 docker 运行它。我有以下内容:
DockerFile
:
FROM mozilla/sbt
ADD build.sbt /root/build/
RUN cd /root/build && sbt compile
EXPOSE 5000
WORKDIR /root/build
CMD sbt run
还有以下docker-compose.yml
:
version: '3.1'
services:
sbt:
build:
context: ./
dockerfile: ./Dockerfile
image: sbt
ports:
- "8080:5000"
volumes:
- "./:/root/build"
我尝试通过docker-compose up
运行它,我可以看到有关服务器启动的日志,但无法通过指定端口访问服务,即8080
。我错过了什么吗?
仅供参考,上述设置的灵感来自 post,我在其中更改了基本映像,还去掉了我不理解的 external-network
位。
【问题讨论】:
添加 build.sbt 可能有助于有人重现这一点。仅使用 Dockerfile 构建和运行时可以访问它吗? 试图弄清楚如何在直接从 dockerfile 运行时挂载卷。它不喜欢它:docker run -it -v "./:/root/build" $(docker build -q .)
任何输出“服务器开始于 127.0.0.1:5000”的东西都可能无法从 Docker 外部访问。您没有说明容器中的进程是什么(可能是基于 Scala 的),但将其设置为侦听 0.0.0.0 可能会使容器间通信和 ports:
设置起作用。参见例如Docker app server ip address 127.0.0.1 difference of 0.0.0.0 ip。
bravo @DavidMaze 做到了 :) 你想将其作为答案发布,还是我应该自己发布答案?
【参考方案1】:
如果应用程序默认在端口 5000 上启动,但您需要使用 docker 在另一个端口上启动它,您应该使用:
ports:
- "8080:5000"
在内部,您的应用程序继续使用 5000 端口,但 docker 将该端口绑定到另一个端口,在示例中为:8080
【讨论】:
啊,不错。我总是使用相同的端口,所以顺序错误。我进行了您建议的更改,停止了服务器,再次运行docker compose up
并尝试访问http://localhost:8080/foo/bar
,但没有任何乐趣。 (更新了问题正文)
#1 应用程序正在运行吗? #2 你有错误日志吗? #3 进入容器docker exec -it myapp bash
,然后执行curl localhost:5000/foo/bar
,如果不行,问题出在你的app,而不是docker
是的,我可以从容器内部成功地到达那个端点。 ://
你在 Windows 上吗?附上 curl localhost:8080/foo/bar -v 日志或将其与内部 curl 进行比较
在 Mac 上。我得到:``` curl localhost:8080/foo/bar -v * 正在尝试 ::1... * TCP_NODELAY 设置 * 连接到 localhost (::1) 端口 8080 (#0) > GET /foo/bar HTTP/1.1 > 主机: localhost:8080 > User-Agent: curl/7.54.0 > Accept: / > * 来自服务器的空回复 * 到主机 localhost 的连接 #0 保持原样 curl: (52) 来自服务器的空回复 `` ` 内部 curl 给了我 json 响应。以上是关于从 docker 容器内运行 sbt 项目的主要内容,如果未能解决你的问题,请参考以下文章