0

您如何强制 rackup 使用端口 0.0.0.0 以便它可以从 docker 容器内部与您的本地环境进行通信?这是我的代码:

# docker-compose.yml

version: '3'
services:
  backend:
    build: ./ruby-backend
    ports:
      - "4567:4567"

# ruby-backend/Dockerfile

FROM ruby:2.4.1
COPY Gemfile /app/Gemfile
WORKDIR /app
RUN bundle install
COPY . /app
EXPOSE 4567
CMD ["bundle", "exec", "rackup", "-p", "4567", "--host", "0.0.0.0"

如果我从容器外部运行此命令,它会非常有效。这是我从本地执行此操作时的终端输出:

$ bundle exec rackup -s puma -p 4567 -o "0.0.0.0"
Puma starting in single mode...
* Version 3.11.0 (ruby 2.4.1-p111), codename: Love Song
* Min threads: 0, max threads: 16
* Environment: development
* Listening on tcp://0.0.0.0:4567
Use Ctrl-C to stop

注意正确的主机:tcp://0.0.0.0:4567. 不幸的是,它在容器中不起作用。这是我使用 docker 执行此操作时的终端输出:

$ dc up backend
Starting devopscourse1_backend_1 ...
Starting devopscourse1_backend_1 ... done
Attaching to devopscourse1_backend_1
backend_1   | Puma starting in single mode...
backend_1   | * Version 3.11.0 (ruby 2.4.1-p111), codename: Love Song
backend_1   | * Min threads: 0, max threads: 16
backend_1   | * Environment: development
backend_1   | * Listening on tcp://localhost:4567
backend_1   | Use Ctrl-C to stop

任何想法我做错了什么?

4

1 回答 1

1

我花了一个晚上自己调试这个,如果你还没有弄清楚的话,我想加入我找到的解决方案。

如果您与容器运行交互式会话会发生什么?

docker run -t -i <image> /bin/bash

这将为您提供容器内的交互式外壳,然后您可以查看容器内文件系统的状态

我最终发现容器使用的 Dockerfile 没有收到我对它所做的更改:将 0.0.0.0 绑定到 rackup 命令。这提醒了我,Dockerfile 在缓存进程的所有设置步骤时,它本身并不是容器设置的一部分。复制到镜像的 Docker 守护程序的第一条指令,因此更改它意味着您需要构建一个新镜像。

解决方案:

  1. docker rm容器
  2. docker rmi图片
  3. docker build将 Dockerfile 更改为CMD
于 2017-12-17T19:49:29.493 回答