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

问题描述 投票:0回答:1

如何强制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

我有什么想法我做错了吗?

docker docker-compose puma rackup
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.