Эта статья была первоначально опубликована на Sjauf. .
На Sjauf Мы хотели найти способ быстро развернуть любое из наших приложений, мониторировать их все в то же время, обновить их всего несколькими щелчками и масштабировать их без необходимости знать все и ауты наших серверов. Мы небольшой запуск, поэтому мы не используем команду DEVOPS или даже администратора сервера. Наше решение необходимо было легко понять, оставаясь надежными и безопасными. Вот как мы это сделали.
Докер
Развертывание приложения на сервер может быть сложной задачей. Серверы имеют разную архитектуру, чем вашу машину для разработки, имеют тенденцию бегать по худшим спецификациям и необходимо настроить с нуля каждый раз, когда вы вращаете один. Кроме того, ваша среда разработки может быть не такой же, как ваш сотрудник. Вот почему мы используем Docker для запуска наших приложений в контейнерах, которые затем могут быть развернуты на наших серверах. Поскольку наши контейнеры Docker всегда бегают с той же архитектурой только с инструментами, которые мы говорим, чтобы установить, мы знаем, что будут вести себя то же самое на нашем сервере и наших машинах развития. Это решает много наших вопросов, но создание надлежащего докера и окружающей среды для приложений эликсира зонтика не так просто, как кажется.
Что-то что-то, Проблема проблема
Когда мы хотели создать наши контейнеры докеров, мы побежали в несколько вопросов. Мы строили наши приложения на компьютерах Mac OSX, чтобы начать эту сборку в нашем контейнере. Поскольку наша архитектура MAC немного отличается от нашей архитектуры контейнера Docker, приложения не будут работать. Это означало необходимость создания наших приложений от самого контейнера Docker. Еще одна проблема, в которой мы столкнулись с нашей приложением, пока наши Postgres Server еще не работают. Это не редкость (и я бы сказал, что это на самом деле лучше), чтобы запустить вашу базу данных Postgres в отдельном контейнере. Используя Docker-Compose, вы можете запустить все свое приложение — база данных и приложений — все сразу. К сожалению, когда вы начинаете свое приложение ELIXIR перед вашей базой данных, ececo жалуется, и ваше приложение не запускается. Вот почему мы добавили сценарий ожидания Postgres, которые мы работаем в качестве нашей командования. Это выглядит немного-то вроде этого:
#!/bin/bash # wait-for-postgres.sh set -e host=$1 username=$2 password=$3 db=$4 start_elixir=$5 until PGPASSWORD="$password" psql -h "$host" -U "$username" -d "$db" -c '\l'; do >&2 echo "Postgres is unavailable - sleeping" sleep 1 done >&2 echo "Postgres is up - executing command" exec $start_elixir
Dockerfile
Чтобы создать образечку докера, которое можно запускать внутри контейнера, вам нужен DockerFile. Вот как наш Докерефиль закончился:
FROM ubuntu:14.04.3 # Set the locale, otherwise elixir will complain later on RUN locale-gen en_US.UTF-8 ENV LANG en_US.UTF-8 ENV LANGUAGE en_US:en ENV LC_ALL en_US.UTF-8 # wget for convenience, use curl if you want to # curl for Appsignal # postgresql-9.6 for checking if the server is running yet so we can launch our applications when PG is already up RUN apt-get -y -q install wget curl postgresql postgresql-contrib # add erlang otp RUN wget https://packages.erlang-solutions.com/erlang-solutions_1.0_all.deb RUN dpkg -i erlang-solutions_1.0_all.deb # Update apt libraries RUN apt-get update # Install build essential for Appsignal RUN apt-get install -y build-essential # Install erlang and elixir RUN apt-get install -y -q esl-erlang elixir # Create app folder ADD . /app # Copy wait-for-postgres script. We need this script to check up on Postgres and wait for it to be ready COPY scripts/wait-for-postgres.sh /app/wait-for-postgres.sh # Own wait-for-postgres script so we can run it RUN chmod +x /app/wait-for-postgres.sh # Set app folder to work dir WORKDIR /app # Installs hex locally RUN mix local.hex --force # Installs rebar locally RUN mix local.rebar --force # Clean appsignal. If we don't do this, it can't compile on a second build RUN mix deps.clean appsignal # Installs all dependencies for production RUN mix deps.get --only-prod # Compiles application RUN MIX_ENV=prod mix do compile, release --env=prod # Set Port ENV PORT 8080 # Run App CMD ["_build/prod/rel/sjauf_umbrella/bin/sjauf_umbrella", "foreground"]
Комментарии в DockerFile должны дать вам представление о том, что делает каждая строка. Поскольку наши подполым добавляются в виде подмодулей Git в нашем репозитории, это всегда актуальны. Эти команды убедитесь, что все они скомпилированы и публикуются автоматически. Создание приложения теперь так же просто, как запуск команды Docker Build:
docker build -t sjauf/sjauf_umbrella .
В этом примере наша организация называется Sjauf, и наш репозиторий называется Sjauf_umbrella. Убедитесь, что вы правильно назовите свой репозиторий, чтобы вы помните, на каком приложении вы работали, когда вы оглядываетесь на это в будущем, сидя на крыше своего пентхауса в Майами, наслаждаясь целой бутылкой черной этикетки с командой Miami Dolphins Cheerleading.
Я надеюсь, что эта статья поможет вам, ребятам, настроив свой собственный эликсир зонтик без слишком большого количества неприятностей. Больше предметов наших DevOps Antics скоро последуют!
Оригинал: «https://dev.to/stefandorresteijn/dockerizing-elixir-umbrella-apps-6go»