I’ve dockerized a ruby app and am trying to view it locally but every browser I have used redirects from http://0.0.0.0:3000 to https://0.0.0.0:3000 so I’m getting the browser error
This site can’t provide a secure connection 0.0.0.0 sent an invalid response.
I’ve tried clearing the cache, browsing history etc. rebooted, and included HTTPS_METHOD: noredirect in docker compose environment.
I can access the site from rails server using http://127.0.0.1:3000 which doesn’t redirect and suggests it’s something in the dockerfile or docker compose that is doing it. I’m new to docker so forgive me I’m missing something obvious.
Here’s the dockerfile
FROM ruby:2.7.7-alpine3.16 AS builder
ENV RAILS_ENV production
ENV RAILS_SERVE_STATIC_FILES true
ENV RAILS_LOG_TO_STDOUT true
ENV SECRET_KEY_BASE 1
# RUN mkdir /app
# WORKDIR /app
# Install required libraries on Alpine
# note: build-base required for nokogiri gem
# note: postgresql-dv required for pg gem
RUN apk update &&
apk add tzdata postgresql-dev &&
apk add postgresql-client &&
apk add nodejs yarn &&
apk add build-base &&
gem install rails bundler &&
# Throw errors if Gemfile has been modified since Gemfile.lock
bundle config --global frozen 1
# Copy Gemfile so we can cache gems
COPY Gemfile Gemfile.lock ./
# Install Ruby gems
RUN bundle install --without development test
# Copy all application files
COPY . .
# Precompile assets
RUN bundle exec rails assets:precompile &&
bundle exec rails webpacker:compile
RUN chmod +x entrypoint.sh
CMD ["/entrypoint.sh"]
EXPOSE 3000
Here’s the docker compose
version: "3.8"
services:
rails:
build:
dockerfile: Dockerfile
context: .
env_file:
- rails.env
environment:
HTTPS_METHOD: noredirect
DB_USERNAME: xxxxxxxx
DB_PASSWORD: .env
DB_DATABASE: xxxxxx_production
DB_PORT: 5432
DB_HOST: db
RAILS_MAX_THREADS: 5
ports:
- "3000:3000"
restart: always
depends_on:
- "db"
db:
image: postgres:13.9-alpine
env_file:
- db.env
environment:
HTTPS_METHOD: noredirect
POSTGRES_USER: xxxxxxx
PGDATA: /var/lib/postgresql/data/pgdata
restart: always
volumes:
- pgdata:/var/lib/postgresql/data
volumes:
pgdata:
and the entrypoint.sh
#!/bin/sh
# Note: !/bin/sh must be at the top of the line,
# Alpine doesn't have bash so we need to use shell.
# Docker entrypoint script.
# Don't forget to give this file execution rights via `chmod +x entrypoint.sh`
# which I've added to the Dockerfile but you could do this manually instead.
# Wait until Postgres is ready before running the next step.
while ! pg_isready -q -h $DB_HOST -p $DB_PORT -U $DB_USERNAME
do
echo "$(date) - waiting for database to start."
sleep 2
done
# If the database exists, migrate. Otherwise setup (create and migrate)
echo "Running database migrations..."
bundle exec rails db:migrate 2>/dev/null || bundle exec rails db:create db:migrate
echo "Finished running database migrations."
# Remove a potentially pre-existing server.pid for Rails.
echo "Deleting server.pid file..."
rm -f /tmp/pids/server.pid
# Start the server.
echo "Starting rails server..."
bundle exec rails server
Any advice much appreciated. Thanks.
2
Answers
Docker doesn’t redirect http to https. There is one possible option in Ruby on Rails. In your environment file for production settings, you’re forcing ssl.
This option forces your browser to use https instead to http. This means the rails server sends a redirect to the browser to https. But your server is not configured for https, so the described errors occurs.
References:
You’re probably using
http://0.0.0.0:3000/
because your app tells you that that’s the address that it’s listening on.However, 0.0.0.0 is not the IP address of the service. It’s the address that it’s ‘bound’ to. And 0.0.0.0 means that it’ll accept connections from anywhere.
The actual address of your service is
http://localhost:3000/
or, as you’ve discovered,http://127.0.0.1:3000/
. The two addresses are equivalent.Read this for more information.