为docker正确设置rackup的主机

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

如果我从容器外部运行它,这个命令工作的很好。 这是当我从我的本地做的terminal输出:

 $ 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时的terminal输出:

 $ 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 

任何想法我做错了什么?

我花了晚上自己debugging,想用我find的解决scheme作为参考,如果你还没有弄明白的话。

如果您使用容器运行交互式会话,会发生什么情况?

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

这会给你一个容器内的交互式shell,然后你可以在容器中查看文件系统的状态

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

解:

  1. docker rm的容器
  2. docker rmi的形象
  3. docker build再次docker build图像与Dockerfile更改为CMD