File size: 5,577 Bytes
bfaed46
 
 
 
 
 
 
 
 
 
 
 
 
93a12e1
bfaed46
 
 
 
 
 
 
 
 
 
4b23ad5
 
bfaed46
 
93ae114
 
 
 
 
 
 
 
 
bfaed46
 
 
 
 
 
 
cb2ad0a
 
 
 
bfaed46
 
 
93ae114
 
cb2ad0a
93ae114
 
cb2ad0a
 
 
 
bfaed46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0d0d5bb
 
bfaed46
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
db17066
 
 
 
 
 
 
 
 
 
 
 
 
 
 
fb8450f
bfaed46
 
db17066
fb8450f
 
 
 
93ae114
 
 
 
 
 
 
 
bfaed46
 
 
 
 
 
 
 
 
 
cb2ad0a
 
 
 
bfaed46
 
cb2ad0a
93ae114
cb2ad0a
93ae114
 
cb2ad0a
 
 
 
93ae114
 
 
 
 
 
 
bfaed46
e9259f5
bfaed46
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# Find eligible builder and runner images on Docker Hub. We use Ubuntu/Debian
# instead of Alpine to avoid DNS resolution issues in production.
#
# https://hub.docker.com/r/hexpm/elixir/tags?page=1&name=ubuntu
# https://hub.docker.com/_/ubuntu?tab=tags
#
# This file is based on these images:
#
#   - https://hub.docker.com/r/hexpm/elixir/tags - for the build image
#   - https://hub.docker.com/_/debian?tab=tags&page=1&name=bullseye-20231009-slim - for the release image
#   - https://pkgs.org/ - resource for finding needed packages
#   - Ex: hexpm/elixir:1.16.0-erlang-26.2.1-debian-bullseye-20231009-slim
#
ARG ELIXIR_VERSION=1.16.1
ARG OTP_VERSION=26.2.1
ARG DEBIAN_VERSION=bullseye-20231009-slim

ARG BUILDER_IMAGE="hexpm/elixir:${ELIXIR_VERSION}-erlang-${OTP_VERSION}-debian-${DEBIAN_VERSION}"
ARG RUNNER_IMAGE="debian:${DEBIAN_VERSION}"

FROM ${BUILDER_IMAGE} as builder

# install build dependencies
RUN apt-get update -y && apt-get install -y build-essential git curl \
    libasound2-dev portaudio19-dev \
    libportaudio2 libportaudiocpp0 \
    && apt-get clean && rm -f /var/lib/apt/lists/*_*

# Add the repository for the Nvidia CUDA
# Import the Nvidia repository GPG key
RUN apt update -q && apt install -y ca-certificates wget && \
    wget -qO /cuda-keyring.deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb && \
    dpkg -i /cuda-keyring.deb && apt update -q

# Install nvidia GPU support
RUN apt-get install -y cuda-nvcc-12-2 libcublas-12-2 libcudnn8

# prepare build dir
WORKDIR /app

# install hex + rebar
RUN mix local.hex --force && \
    mix local.rebar --force


# NOTE: Some config borrowed from this HF example:
# https://huggingface.co/spaces/SpacesExamples/single_file_phx_bumblebee_ml/blob/main/Dockerfile

# set build ENV
ENV MIX_ENV="prod"

# bumblebee - XLA_TARGET must exist before deps pulled
ENV XLA_TARGET="cuda120"
ENV BUMBLEBEE_CACHE_DIR="/app/.bumblebee"
ENV XLA_CACHE_DIR="/data/cache/xla"

ENV MIX_HOME="/app/.mix"
ENV EXS_DRY_RUN="true"
ENV MIX_INSTALL_DIR="/app/.mix"

# install mix dependencies
COPY mix.exs mix.lock ./
RUN mix deps.get --only $MIX_ENV
RUN mkdir config

# copy compile-time config files before we compile dependencies
# to ensure any relevant config change will trigger the dependencies
# to be re-compiled.
COPY config/config.exs config/${MIX_ENV}.exs config/
RUN mix deps.compile

COPY priv priv

COPY lib lib

COPY assets assets

# COPY storybook storybook

# compile assets
RUN mix assets.deploy

# Compile the release
RUN mix compile

# Changes to config/runtime.exs don't require recompiling the code
COPY config/runtime.exs config/

COPY rel rel
RUN mix release

# start a new build stage so that the final image will only contain
# the compiled release and other runtime necessities
FROM ${RUNNER_IMAGE}

RUN apt-get update -y && \
  apt-get install -y libstdc++6 openssl libncurses5 locales ca-certificates curl unzip \
  && apt-get clean && rm -f /var/lib/apt/lists/*_*

RUN apt-get update -y && \
  apt-get install -y postgresql-client \
  && apt-get clean && rm -f /var/lib/apt/lists/*_*

# Install streaming audio dependencies
RUN apt-get update -y && \
  apt-get install -y ffmpeg libasound2-dev portaudio19-dev \
  && apt-get clean && rm -f /var/lib/apt/lists/*_*

# Install Chrome dependencies
RUN apt-get update -y && \
  apt-get install -y fonts-liberation libatk-bridge2.0-0 libatk1.0-0 \
  libatspi2.0-0 libcups2 libgtk-3-0 libnspr4 libnss3 libu2f-udev libxcomposite1 wget xdg-utils \
  && apt-get clean && rm -f /var/lib/apt/lists/*_*

# Chrome is used for PDF generation - ChromicPDF library
RUN curl -LO https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
RUN apt-get install -y ./google-chrome-stable_current_amd64.deb \
  && apt-get clean && rm -f ./google-chrome-stable_current_amd64.deb

# Nvidia stuff
RUN apt update -q && apt install -y ca-certificates wget && \
    wget -qO /cuda-keyring.deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.1-1_all.deb && \
    dpkg -i /cuda-keyring.deb && apt update -q

# Nvidia support in runtime layer
RUN apt-get install -y --no-install-recommends cuda-nvcc-12-2 libcublas-12-2 libcudnn8

# Set the locale
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen

ENV LANG en_US.UTF-8
ENV LANGUAGE en_US:en
ENV LC_ALL en_US.UTF-8

WORKDIR "/app"
RUN chown nobody /app

# NOTE: Some config borrowed from this HF example:
# https://huggingface.co/spaces/SpacesExamples/single_file_phx_bumblebee_ml/blob/main/Dockerfile

# set build ENV
ENV MIX_ENV="prod"

# bumblebee - XLA_TARGET must exist before deps pulled
ENV XLA_TARGET="cuda120"
ENV BUMBLEBEE_CACHE_DIR="/app/.bumblebee"
ENV XLA_CACHE_DIR="/data/cache/xla"

ENV MIX_HOME="/app/.mix"
ENV EXS_DRY_RUN="true"
ENV MIX_INSTALL_DIR="/app/.mix"

# ENV CUDA_HOME="/usr/local/cuda"
# ENV PATH="${CUDA_HOME}/bin:${PATH}"
# ENV LD_LIBRARY_PATH="${CUDA_HOME}/lib64:$LD_LIBRARY_PATH"

RUN echo "export PATH=/usr/local/cuda/bin:${PATH}" >> /root/.bashrc
RUN echo "export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH" >> /root/.bashrc

# Only copy the final release from the build stage
COPY --from=builder --chown=nobody:root /app/_build/${MIX_ENV}/rel/medicode ./

USER nobody

# If using an environment that doesn't automatically reap zombie processes, it is
# advised to add an init process such as tini via `apt-get install`
# above and adding an entrypoint. See https://github.com/krallin/tini for details
# ENTRYPOINT ["/tini", "--"]

CMD ["/app/bin/server"]