Bcrypt.Base.gensalt_nif/3 is undefined (Elixir)

https://qiita.com/official-events/5cb794f7cb9ac194ed70

**表と裏、両面のこころがけ、どれもおろそかにしてはならじ。**

Advent Calendar 2022 28日目[^1]の記事です。
I'm ready for 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
I'm looking forward to 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
I can't wait for 12/25,2022 :santa::santa_tone1::santa_tone2::santa_tone3::santa_tone4::santa_tone5:
私の[Advent Calendar 2022 一覧](https://docs.google.com/spreadsheets/d/1HQvFjagQLRPjOYAjDVzWp9S4b8dKixxvvaz_TtbZWto/edit#gid=1723448955)。

[^1]: @kaizen_nagoya さんの「[「@e99h2121 アドベントカレンダーではありますまいか Advent Calendar 2020」の改訂版ではありますまいか Advent Calendar 2022 １日目　Most Breakthrough Generator](https://qiita.com/kaizen_nagoya/items/49ebebee3a0377f3b59b)」から着想を得て、模倣いたしました。 

---



# はじめに

[Elixir](https://elixir-lang.org/)を楽しんでいますか:bangbang::bangbang::bangbang:

**Bcrypt.Base.gensalt_nif/3 is undefined**

```elixir
** (UndefinedFunctionError) function Bcrypt.Base.gensalt_nif/3 is undefined (module Bcrypt.Base is not available)
```

このエラーで悩んだことがありました。
一応解決できたので記事を残しておきます。

![スクリーンショット 2022-01-28 23.34.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/131808/c1e166ef-4982-f2a5-3b0d-d783e0037ba7.png)


# Bcrypt.Base.gensalt_nif/3 is undefined

けっこう悩んでいるfolksがいるようです。

https://elixirforum.com/t/function-bcrypt-base-gensalt-nif-3-is-undefined-module-bcrypt-base-is-not-available/15523

https://stackoverflow.com/questions/68855832/module-bcrypt-base-is-not-available

# 私の場合

もともとローカルで[Phoenix](https://www.phoenixframework.org/)アプリを動かしました。
あとからDockerで動かそうとして、問題に遭遇しました。
結論をざっくりお伝えすると、ローカルマシン上で以前ビルドした`deps`や`_build`を見に行ってしまっていておかしな具合になっていました。

`Dockerfile`や`docker-compose.yml`の書き方次第で解決できたのかもしれません。

私の場合は、まあ一回まっさらからやってみるかということで、Dockerのコンテナ、イメージ、ボリュームを消して、さらに`_build`、`deps`を消して、再度ビルドして動かしてみると動くようになりました。

だいたい以下のような感じです。

```
$ docker ps -a
```

でてきた`CONTAINER ID`と`IMAGE`をメモ

```
$ docker rm <コンテナID>
$ docker rmi <Image名>
$ docker image prune
$ docker volume prune
$ rm -rf _build
$ rm -rf deps
$ docker-compose build
$ docker-compose up
```



## Docker

あとから、[Phoenix](https://www.phoenixframework.org/)アプリに追加したDocker関係のファイルを説明します。

### Configuration

使用する際には、`config`配下のファイルを少しデフォルトから変更する必要があります。

```diff:config/dev.exs
 config :realworld, Realworld.Repo,
   username: "postgres",
   password: "postgres",
-  hostname: "localhost",
+  hostname: "db",
   database: "realworld_dev",
   show_sensitive_data_on_connection_error: true,
   pool_size: 10

 config :realworld, RealworldWeb.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: {127, 0, 0, 1}, port: 4000],
+  http: [ip: {0, 0, 0, 0}, port: 4000],
   check_origin: false,
   code_reloader: true,
   debug_errors: true,
```

> Change to `ip: {0, 0, 0, 0}` to allow access from other machines.

この`http: [ip: {0, 0, 0, 0}, port: 4000]`設定を知らずに、あれ〜　http://localhost:4000 につながんないなあ〜　とけっこう悩んだりしました。


```diff:config/test.exs
 config :realworld, Realworld.Repo,
   username: "postgres",
   password: "postgres",
-  hostname: "localhost",
+  hostname: "db",
   database: "realworld_test#{System.get_env("MIX_TEST_PARTITION")}",
   pool: Ecto.Adapters.SQL.Sandbox,
   pool_size: 10
```

### Docker関係のファイル

あとから、[Phoenix](https://www.phoenixframework.org/)アプリに追加したDocker関係のファイルは以下のようなものです。

```docker:Dockerfile
FROM hexpm/elixir:1.13.1-erlang-24.2.1-debian-bullseye-20210902-slim

RUN apt-get update && \
    apt-get install --yes build-essential inotify-tools postgresql-client && \
    apt-get clean

RUN mix local.hex --force && \
  mix archive.install hex phx_new --force && \
  mix local.rebar --force

ADD . /app
WORKDIR /app
EXPOSE 4000

CMD ["/app/entrypoint.sh"]
```

`Dockerfile`の内容はもうちょっと厳選できるのかもしれません。
`bcrypt`のビルドに`make`が必要だというログがでていたので、エイってな具合で`build-essential`を入れています。


```yml:docker-compose.yml
version: '3'
services:
  web:
    build: .
    ports:
      - '4000:4000'
    volumes:
      - .:/app
    depends_on:
      - db

  db:
    image: postgres:13-alpine
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    ports:
      - 5432:5432
    volumes:
      - db:/var/lib/postgresql/data
volumes:
  db:
```

```sh:entrypoint.sh
#!/bin/bash
# Docker entrypoint script.

# Wait until Postgres is ready
echo "Testing if Postgres is accepting connections."
while ! pg_isready -q -h db -p 5432 -U postgres
do
  echo "$(date) - waiting for database to start"
  sleep 2
done

mix setup
mix deps.compile

exec mix phx.server
```

```:.dockerignore
deps
_build
```

### Run

```
$ docker-compose build
$ docker-compose up
```

Visit: http://localhost:4000

### テスト

```
$ docker-compose run --rm web mix test
```







# Wrapping up :lgtm::lgtm::lgtm::lgtm::lgtm:

Enjoy [Elixir](https://elixir-lang.org/):bangbang::bangbang::bangbang:
<font color="purple">$\huge{Enjoy\ Elixir🚀}$</font>

悩み多い記事でした。
一応動いたよ〜　くらいのものでして、まだまだ悩み多い記事です。
ただ、あれ〜　なんでDockerだと動かね〜んだー　と次になったときにはヒントになりそうです。
ということを書いておかないと記憶に定着しないので、外化しておきます。
お付き合いありがとうございます :pray::pray_tone1::pray_tone2::pray_tone3::pray_tone4::pray_tone5: 


---
2022年に流行る技術予想 ーー それは、[Elixir](https://elixir-lang.org/)、[Phoenix LiveView](https://github.com/phoenixframework/phoenix_live_view)、[Livebook](https://github.com/livebook-dev/livebook)、[Nerves Livebook](https://github.com/livebook-dev/nerves_livebook)です:rocket::rocket::rocket:

[Elixir](https://elixir-lang.org/)の誕生日は、2012年5月24日です。
そのため、今年の2022年5月24日は10周年を迎えます。

```elixir
iex> Date.diff(~D[2022-05-24], ~D[2022-01-27])
117
```


そうそう！
2月24日発売予定の[WEB+DB PRESS](https://gihyo.jp/magazine/wdpress)で、[Elixir](https://elixir-lang.org/)と[Phoenix](https://www.phoenixframework.org/)の特集がでますよ〜

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">次号のWEB+DB PRESSでElixirとPhoenix特集が出ます！お楽しみに！！1 <a href="https://t.co/d4hIfhIfZ1">pic.twitter.com/d4hIfhIfZ1</a></p>&mdash; 栗林健太郎 (@kentaro) <a href="https://twitter.com/kentaro/status/1483308857019760640?ref_src=twsrc%5Etfw">January 18, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>






---

I organize [autoracex](https://autoracex.connpass.com/).
And I belong to [NervesJP](https://nerves-jp.connpass.com/), [fukuoka.ex](https://fukuokaex.connpass.com/), [EDI](https://fukuokaex.connpass.com/).
I hope someday you'll join us.

[We Are The Alchemists, my friends!](https://www.youtube.com/watch?v=04854XqcfCY)