web-dev-qa-db-fra.com

Docker Rails ne parvient pas à être servie - curl: (56) Échec Recv: réinitialisation de la connexion par l'homologue

Je crée un Rails conteneur d'application avec le Dockerfile suivant:

$ cat Dockerfile
FROM Ruby:2.2

MAINTAINER Luca G. Soave <[email protected]>

RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y mysql-client postgresql-client sqlite3 --no-install-recommends && rm -rf /var/lib/apt/lists/*

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY . /usr/src/app/
RUN bundle install

EXPOSE 3000
CMD ["Rails", "server"]

la construction réussit:

$ docker build -t querier .
Sending build context to Docker daemon 46.75 MB
Sending build context to Docker daemon 
...
Step 10 : CMD Rails server
 ---> Running in 8eb62f8a579a
 ---> 65eee929d518
Removing intermediate container 8eb62f8a579a
Successfully built 65eee929d518

le conteneur est en cours d'exécution:

$ docker logs -f 89ff3bb8c584
=> Booting WEBrick
=> Rails 4.2.0 application starting in development on http://localhost:3000
=> Run `Rails server -h` for more startup options
=> Ctrl-C to shutdown server
[2015-01-06 19:56:56] INFO  WEBrick 1.3.1
[2015-01-06 19:56:56] INFO  Ruby 2.2.0 (2014-12-25) [x86_64-linux]
[2015-01-06 19:56:56] INFO  WEBrick::HTTPServer#start: pid=1 port=3000

et il exporte le port 3000/tcp:

$ docker ps -al
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
89ff3bb8c584        querier:latest      "Rails server"      16 minutes ago      Up 16 minutes       0.0.0.0:3000->3000/tcp   gloomy_babbage   

mais le serveur n'est pas accessible Docker "en interne" ou "en externe":

$ curl 0.0.0.0:3000
curl: (56) Recv failure: Connection reset by peer
$ curl 172.17.0.24:3000
curl: (7) Failed to connect to 172.17.0.24 port 3000: Connection refused

mais tout semble ok:

$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' 89ff3bb8c584
172.17.0.24
$ netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         10.36.32.1      0.0.0.0         UG        0 0          0 wlan0
10.0.3.0        *               255.255.255.0   U         0 0          0 lxcbr0
10.36.32.0      *               255.255.248.0   U         0 0          0 wlan0
172.17.0.0      *               255.255.0.0     U         0 0          0 docker0

$ ping 0.0.0.0
PING 0.0.0.0 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.069 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.061 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.069 ms
^C
--- 0.0.0.0 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.061/0.066/0.069/0.007 ms

$ ping 172.17.0.24
PING 172.17.0.24 (172.17.0.24) 56(84) bytes of data.
64 bytes from 172.17.0.24: icmp_seq=1 ttl=64 time=0.085 ms
64 bytes from 172.17.0.24: icmp_seq=2 ttl=64 time=0.107 ms
64 bytes from 172.17.0.24: icmp_seq=3 ttl=64 time=0.076 ms
^C

J'ai essayé aussi dans le navigateur mais rien. Le système hôte est:

$ docker -v
Docker version 1.4.1, build 5bc2ff8
$ uname -a 
Linux basenode 3.11.0-18-generic #32-Ubuntu SMP Tue Feb 18 21:11:14 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux

Une idée?

20
BBJ3

documentation du serveur Rails indique que le serveur se lie par défaut à localhost, ce qui empêche généralement l'application dockée d'accepter les connexions. Essayez de le changer en 0.0.0.0.

56
Mykola Gurov

Je viens de signaler la réponse de Mykola Gurov parce que c'est la bonne `` cause '' de mon problème, de toute façon j'aimerais également ajouter la solution que j'ai implémentée pour contourner cette cause, juste pour suivre l'objectif.

J'ai modifié config/boot.rb en ajoutant l'option par défaut:

$ cat config/boot.rb
# Set up gems listed in the Gemfile.
ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)

require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])

########  added lines  ########
require 'Rails/commands/server' 

module Rails
  class Server
    alias :default_options_alias :default_options
    def default_options
      default_options_alias.merge!(:Host => '0.0.0.0')
    end
  end
end
###############################

Si vous ne voulez pas modifier config/boot.rb, une autre solution pourrait forcer Dockerfile à lier l'hôte 0.0.0.0 en tant que paramètre ENTRYPOINT/CMD:

$ cat Dockerfile
FROM Ruby:2.2

RUN apt-get update && apt-get install -y nodejs --no-install-recommends && rm -rf /var/lib/apt/lists/*
RUN apt-get update && apt-get install -y mysql-client postgresql-client sqlite3 --no-install-recommends && rm -rf /var/lib/apt/lists/*

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

COPY . /usr/src/app/
RUN bundle install

EXPOSE 3000
ENTRYPOINT ["Rails", "server", "-b", "0.0.0.0"]
4
BBJ3