Рубрики
Uncategorized

Докереный эликсир зонтик приложений

Часть 1 нашего эликсира серии Development / Развертывание. Помечено Elixir, DevOps, Docker.

Эта статья была первоначально опубликована на 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»