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"]
|