GIGALIXIR's app run environment. The Dockerfile here describes what is running on each container in a GIGALIXIR app.

# Development

# Decrypt secrets needed for the docker images
```
mkdir -p secrets
cp encrypted_secrets/ssh_host_keys.tar.asc secrets/
cd secrets
gpg -d ssh_host_keys.tar.asc > ssh_host_keys.tar
tar xf ssh_host_keys.tar
```

```
python3 -m venv venv3
source venv3/bin/activate
pip3 install -U pip
pip3 install -U setuptools
pip3 install -e .[dev]
pytest
pytest -k test_mix_init
```

Manual testing
```
docker pull heroku/heroku:16
docker pull heroku/heroku:18
docker pull heroku/heroku:20

docker build --rm -t gigalixir-run .
# for heroku-16, use
docker build --rm -t gigalixir-run-16 . -f Dockerfile.heroku-16
# for heroku-18, use
docker build --rm -t gigalixir-run-18 . -f Dockerfile.heroku-18
# for heroku-20, use
docker build --rm -t gigalixir-run-20 . -f Dockerfile.heroku-20
export APP_KEY=""
export LOGPLEX_TOKEN=""
```

# for mix app

```
gigalixir rollback -r 715 -a bar
docker run --rm -P -e PORT=4000 -e APP_KEY=$APP_KEY -e MY_POD_IP=127.0.0.1 -e ERLANG_COOKIE=123 -e LOGPLEX_TOKEN=$LOGPLEX_TOKEN -e REPO=bar -e SECRET_KEY_BASE=$SECRET_KEY_BASE gigalixir-run-20 init bar foreground
```

# then exec into the container and run
# docker exec -it $(docker ps | awk '/run-20/ { print $1 }') /bin/bash
# then ssh into the container and run
docker ps # find the port
ssh root@localhost -p $port


```
gigalixir_run remote_console
gigalixir_run run -- mix help
```

Test other commands
```
# this is the command used by app_controller.ex#run
docker run --rm -P -e APP_KEY=$APP_KEY -e MY_POD_IP=127.0.0.1 -e ERLANG_COOKIE=123 -e LOGPLEX_TOKEN=$LOGPLEX_TOKEN -e REPO=bar -e SECRET_KEY_BASE=$SECRET_KEY_BASE gigalixir-run-18 job mix help
docker run --rm -P -e APP_KEY=$APP_KEY -e MY_POD_IP=127.0.0.1 -e ERLANG_COOKIE=123 -e LOGPLEX_TOKEN=$LOGPLEX_TOKEN -e REPO=bar -e SECRET_KEY_BASE=$SECRET_KEY_BASE --entrypoint="" gigalixir-run-18 /usr/bin/dumb-init -- gigalixir_run job -- mix --version
```

Repeat for gigalixir-run-16

# for distillery app. maybe deprecate this since it's been a long time since distillery 2 has been out and I don't have a good test repo anymore. release 689 here is actually 334 and doesn't work with postgres anymore cuz of a parse error..

# ```
# gigalixir rollback -r 689 -a bar
# docker run --rm -P -e PORT=4000 -e APP_KEY=$APP_KEY -e MY_POD_IP=127.0.0.1 -e ERLANG_COOKIE=123 -e LOGPLEX_TOKEN=$LOGPLEX_TOKEN -e REPO=bar -e SECRET_KEY_BASE=$SECRET_KEY_BASE gigalixir-run-18 init bar foreground
# ```
# 
# # then exec into the container and run
# docker ps # find the port
# ssh root@localhost -p $port
# 
# 
# ```
# gigalixir_run remote_console
# gigalixir_run run -- remote_console 
# 
# # go and change the DATABASE_URL if needed, but do not re-run rollback because rollback also rolls back the DATABASE_URL!
# gigalixir_run migrate
# gigalixir_run run -- eval "'Elixir.Ecto.Migrator':run(lists:nth(1, 'Elixir.Application':get_env(gigalixir_getting_started, ecto_repos)), 'Elixir.Application':app_dir(gigalixir_getting_started, <<\"priv/repo/migrations\">>), up, [{all, true}])"
# gigalixir rollback -r 335 -a bar
# gigalixir_run upgrade 0.0.2 # 3f336 -> dba65a
# ```

# check jobs
# docker run --rm -P -e APP_KEY=$APP_KEY -e MY_POD_IP=127.0.0.1 -e ERLANG_COOKIE=123 -e LOGPLEX_TOKEN=$LOGPLEX_TOKEN -e REPO=bar -e SECRET_KEY_BASE=$SECRET_KEY_BASE gigalixir-run-18 job bin/gigalixir-getting-started help

# for distillery 2.0
```
gigalixir rollback -r 703 -a bar
docker run --rm -P -e PORT=4000 -e APP_KEY=$APP_KEY -e MY_POD_IP=127.0.0.1 -e ERLANG_COOKIE=123 -e LOGPLEX_TOKEN=$LOGPLEX_TOKEN -e REPO=bar -e SECRET_KEY_BASE=$SECRET_KEY_BASE gigalixir-run-18 init bar foreground
# ssh in and
gigalixir_run migrate
gigalixir_run distillery_eval -- "Ecto.Migrator.run(List.first(Application.get_env(:gigalixir_getting_started, :ecto_repos)), Application.app_dir(:gigalixir_getting_started, \"priv/repo/migrations\"), :up, all: true)"
gigalixir_run run -- remote_console 
```

gigalixir rollback -r 704 -a bar
# ssh in and 
gigalixir_run upgrade 0.2.0 

# for elixir releases 
```
gigalixir rollback -r 707 -a bar
docker run --rm -P -e APP_KEY=$APP_KEY -e MY_POD_IP=127.0.0.1 -e ERLANG_COOKIE=123 -e LOGPLEX_TOKEN=$LOGPLEX_TOKEN -e REPO=bar -e SECRET_KEY_BASE=$SECRET_KEY_BASE gigalixir-run-18 job -- bin/gigalixir_getting_started eval 'IO.inspect 123+123'
docker run --rm -P -e APP_KEY=$APP_KEY -e MY_POD_IP=127.0.0.1 -e ERLANG_COOKIE=123 -e LOGPLEX_TOKEN=$LOGPLEX_TOKEN -e REPO=bar -e SECRET_KEY_BASE=$SECRET_KEY_BASE gigalixir-run-18 init bar start
```

# ssh in and

```
gigalixir_run remote_console
```


# for api

export SECRET_KEY_BASE=
export SLUG_URL=
docker run --rm -p 4000:4000 -e APP_KEY=$APP_KEY -e MY_POD_IP=127.0.0.1 -e ERLANG_COOKIE=123 -e LOGPLEX_TOKEN=$LOGPLEX_TOKEN -e REPO=bar -e SECRET_KEY_BASE=$SECRET_KEY_BASE -e REPLACE_OS_VARS=true gigalixir-run api bar gigalixir_getting_started "$SLUG_URL" foreground
```

# Deploy

```
# if already built, run
docker tag gigalixir-run-16 us.gcr.io/gigalixir-152404/run-16
docker tag gigalixir-run-18 us.gcr.io/gigalixir-152404/run-18
docker tag gigalixir-run-20 us.gcr.io/gigalixir-152404/run-20

# if need to build, run
docker build --rm -t us.gcr.io/gigalixir-152404/run-16 . -f Dockerfile.heroku-16 
docker build --rm -t us.gcr.io/gigalixir-152404/run-18 . -f Dockerfile.heroku-18
docker build --rm -t us.gcr.io/gigalixir-152404/run-20 . -f Dockerfile.heroku-20

# push
gcloud docker -- push us.gcr.io/gigalixir-152404/run-16 
gcloud docker -- push us.gcr.io/gigalixir-152404/run-18
gcloud docker -- push us.gcr.io/gigalixir-152404/run-20

# deprecated
# docker build --rm -t us.gcr.io/gigalixir-152404/run . 
# gcloud docker -- push us.gcr.io/gigalixir-152404/run 
```

# Push dev tag
```
docker tag gigalixir-run us.gcr.io/gigalixir-152404/run:dev
gcloud docker -- push us.gcr.io/gigalixir-152404/run:dev
```