Hi Folks,
I have started working on a project that was not built using docker. Its pheonix framework with liveview implementation. The problem is that in docker there are two problems,
- Auto reload does not work despite all settings
- Page reloads are extremely slow. It takes 10-20 seconds for page refresh. In the terminal i see after page refresh nothing happens but close to 8-9 seconds db requets for data get fired and then page reloads.
I have spent 2 weeks on this trying different online solutions but no joy.
Following are my docker files.
# Use the latest Elixir image
FROM elixir:latest
# Accept OBAN_AUTH_KEY as a build argument
ARG OBAN_AUTH_KEY
ARG OBAN_PUBLIC_KEY
# Set default to dev environment
ARG MIX_ENV=dev
ENV MIX_ENV=${MIX_ENV}
RUN echo "MIX ENV"
RUN echo $MIX_ENV
RUN apt-get update && \
apt-get install -y postgresql-client && \
apt-get install -y inotify-tools && \
apt-get install -y git nodejs npm curl && \
curl -L https://npmjs.org/install.sh | sh
# Install Hex and Rebar
RUN mix local.hex --force && \
mix local.rebar --force && \
mix hex.repo add oban https://getoban.pro/repo \
--fetch-public-key $OBAN_PUBLIC_KEY \
--auth-key $OBAN_AUTH_KEY
WORKDIR /app
# Copy mix and hex files
COPY mix.exs mix.lock ./
# COPY config config
# Install dependencies
RUN mix deps.get
# Install Node dependencies
COPY assets/package.json assets/
RUN if [ -f assets/package.json ]; then cd assets && npm install && cd ..; fi
COPY . .
# Copy the rest of your app's source code
# Compile the app
# RUN mix do compile
# CMD ["mix", "phx.server"]
# CMD ["/bin/entrypoint.sh"]
entry script
#!/bin/bash
echo "Postgres Host: $POSTGRES_HOST"
echo "Postgres Port: $POSTGRES_PORT"
echo "Postgres User: $POSTGRES_USER"
echo "GOOGLE_APPLICATION_CREDENTIALS is set to: $GOOGLE_APPLICATION_CREDENTIALS"
# Set the password for PostgreSQL commands
export PGPASSWORD=$POSTGRES_PASSWORD
# Docker entrypoint script.
# Wait until Postgres is ready
while ! pg_isready -q -h $POSTGRES_HOST -p $POSTGRES_PORT -U $POSTGRES_USER
do
echo "$(date) - waiting for database to start"
sleep 2
done
# Check if the database exists
DB_EXISTS=$(psql -U $POSTGRES_USER -h $POSTGRES_HOST -p $POSTGRES_PORT -lqt | cut -d \| -f 1 | grep -w $POSTGRES_DB | wc -l)
# If the database exists, run migrations. Otherwise, run setup.
if [ "$DB_EXISTS" -eq "0" ]; then
echo "Database does not exist. Running mix ecto.setup..."
mix ecto.setup
else
echo "Database exists. Running migrations..."
mix ecto.migrate
fi
# echo "Running Seeds"
# mix ecto.seed
echo "Starting Phoenix server..."
exec iex -S mix phx.server
Docker compose
networks:
backend:
services:
hndl_platform:
container_name: hndl__platform
command: sh -c "./bin/entrypoint.sh"
build:
context: .
dockerfile: Dockerfile.dev
args:
OBAN_AUTH_KEY: ${OBAN_AUTH_KEY}
OBAN_PUBLIC_KEY: ${OBAN_PUBLIC_KEY}
MIX_ENV: ${MIX_ENV}
ports:
- "4000:4000"
env_file:
- .env # Path to your environment file
environment:
GOOGLE_APPLICATION_CREDENTIALS: /app/google-credentials.json
depends_on:
- hndl_db
volumes:
- .:/app
- ./google-credentials.json:/app/google-credentials.json
networks:
backend:
hndl_db:
container_name: hndl__db
image: postgis/postgis
restart: always
ports:
- 5432:5432
env_file:
- .env # Path to your environment file
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
backend:
pgadmin:
# connect using host: host.docker.internal
container_name: hndl__pgadmin
image: dpage/pgadmin4:latest
restart: always
environment:
PGADMIN_DEFAULT_EMAIL: hndl@test.com
PGADMIN_DEFAULT_PASSWORD: hndl
ports:
- "5050:80"
volumes:
postgres_data:
dev file
import Config
# Configure your database
config :hndl, Hndl.Repo,
username: System.get_env("POSTGRES_USER") || "postgres",
password: System.get_env("POSTGRES_PASSWORD") || "postgres",
hostname: System.get_env("POSTGRES_HOST") || "localhost",
database: System.get_env("HNDL_DEV_DATABASE") || System.get_env("POSTGRES_DB") || "hndl_dev",
stacktrace: true,
show_sensitive_data_on_connection_error: true,
pool_size: 10,
types: Hndl.PostgresTypes
# For development, we disable any cache and enable
# debugging and code reloading.
#
# The watchers configuration can be used to run external
# watchers to your application. For example, we use it
# with esbuild to bundle .js and .css sources.
config :hndl, HndlWeb.Endpoint,
# Binding to loopback ipv4 address prevents access from other machines.
# Change to `ip: {0, 0, 0, 0}` to allow access from other machines.
http: [ip: {0, 0, 0, 0}, port: 4000],
check_origin: false,
code_reloader: true,
debug_errors: true,
secret_key_base: "something",
watchers: [
esbuild: {Esbuild, :install_and_run, [:default, ~w(--sourcemap=inline --watch)]},
tailwind: {Tailwind, :install_and_run, [:default, ~w(--watch)]}
]
# ## SSL Support
#
# In order to use HTTPS in development, a self-signed
# certificate can be generated by running the following
# Mix task:
#
# mix phx.gen.cert
#
# Run `mix help phx.gen.cert` for more information.
#
# The `http:` config above can be replaced with:
#
# https: [
# port: 4001,
# cipher_suite: :strong,
# keyfile: "priv/cert/selfsigned_key.pem",
# certfile: "priv/cert/selfsigned.pem"
# ],
#
# If desired, both `http:` and `https:` keys can be
# configured to run both http and https servers on
# different ports.
# Watch static and templates for browser reloading.
config :hndl, HndlWeb.Endpoint,
live_reload: [
patterns: [
~r"priv/static/(?!uploads).*(js|css|png|jpeg|jpg|gif|svg)$",
~r"priv/gettext/.*(po)$",
~r"lib/hndl_web/live/.*(ex|heex|leex)$",
~r"lib/hndl_web/components/.*(ex|heex|leex)$",
~r"lib/hndl_web/views/.*(ex)$",
~r"lib/hndl_web/controllers/.*(ex)$",
~r"lib/hndl_web/hooks/.*(ex)$"
],
backend: [
Phoenix.LiveReloader.PollingBackend,
# Polling interval in milliseconds
interval: 1000
]
]
# Enable dev routes for dashboard and mailbox
config :hndl, dev_routes: true
# Do not include metadata nor timestamps in development logs
config :logger, :console, format: "[$level] $message\n"
# Set a higher stacktrace during development. Avoid configuring such
# in production as building large stacktraces may be expensive.
config :phoenix, :stacktrace_depth, 20
# Initialize plugs at runtime for faster development compilation
config :phoenix, :plug_init_mode, :runtime
# Disable swoosh api client as it is only required for production adapters.
config :swoosh, :api_client, false
config :hndl, YOJEE_TEMPLATE_TYPE_ID: 1580
config :hndl, YOJEE_SENDER_ID: "4099"
config :stripity_stripe,
signing_secret: "something"
config :hndl, :addressr_client, base_url: "http://localhost:8080"
config :hndl, :yojee,
access_token: "something",
base_url: "https://umbrella-staging.com",
company_slug: "handelgroup-test"
config :hndl, env: :dev
config :appsignal, :config, active: false
Update
code_reloader: false,
solves the speed issue. BUt still no auto reload