从 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 项目的主要内容,如果未能解决你的问题,请参考以下文章

Docker容器中的Intellij CE 2018.2 + SBT:远程调试断点无法正常工作

dock helloworld

sbt生成的docker容器打包子项目失败

Docker入门介绍

简单使用docker

docker初探