正确为docker设置了机架puma的主机

时间:2017-12-09 20:21:34

标签: docker docker-compose puma 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

任何想法我做错了什么?

1 个答案:

答案 0 :(得分:1)

我整个晚上都在调试这个问题,如果你还没有弄明白的话,我希望能找到我找到的解决方案。

如果您与容器运行交互式会话会怎样?

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

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

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

溶液:

  1. docker rm容器
  2. docker rmi图片
  3. docker build图像再次与Dockerfile一起更改为CMD