Hi Guys. I have elixir/phoenix running inside a docker container with docker compose and I realised my project takes much more time to run tests inside docker and it’s needed to compile every single time I run my tests, even by running just one test.
Does anyone know how to solve this problem?
Thanks.
docker-compose.yml
version: "3.4"
services:
db:
image: "mdillon/postgis"
volumes:
- db_store:/var/lib/postgresql/data
ports:
- "5432:5432"
redis:
image: "redis:5.0"
web:
build:
context: .
target: build
args:
MIX_ENV: "dev"
command: '/bin/bash -c "while true; do sleep 10; done;"'
volumes:
- .:/opt/app
- ./priv/ua_inspector:/opt/data/ua_inspector
- build_cache:/opt/cache
- elixir_mix:/root/.mix
depends_on:
- db
- redis
ports:
- "4000:4000"
ulimits:
nofile: 1024
# memlock: 64
nproc: 63090
environment:
- LOCAL_USER_ID=${LOCAL_USER_ID}
env_file: .env.development
tty: true
stdin_open: true
volumes:
db_store: {}
build_cache: {}
elixir_mix: {}
Dockerfile
#########################################################
## BUILD STAGE - Development image with necessary deps ##
#########################################################
FROM verybigthings/elixir:1.8 AS build
ARG WORKDIR=/opt/app
ARG MIX_ENV=prod
ARG APP_USER=user
ENV MIX_ENV=${MIX_ENV}
ENV WORKDIR=$WORKDIR
ENV APP_USER=$APP_USER
ENV MIX_HOME=/opt/cache/mix
ENV HEX_HOME=/opt/cache/hex
ENV BUILD_PATH=/opt/cache/_build
ENV DEPS_PATH=/opt/cache/deps
RUN apt-get update \
&& apt-get install -y \
# wkhtmltopdf \
xvfb \
libssl1.0-dev \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
RUN tar vxf wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
RUN cp wkhtmltox/bin/wk* /usr/local/bin/
RUN apt-get update && apt-get install -y \
make vim less bash git locales inotify-tools postgresql-client
# Tool to propagate singals from the container to the app
ENV PID1_VERSION=0.1.2.0
RUN curl -sSL "https://github.com/fpco/pid1/releases/download/v${PID1_VERSION}/pid1-${PID1_VERSION}-linux-x86_64.tar.gz" | tar xzf - -C /usr/local \
&& chown root:root /usr/local/sbin \
&& chown root:root /usr/local/sbin/pid1
WORKDIR $WORKDIR
RUN mix local.hex --force && \
mix local.rebar --force
# Set entrypoint
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["/bin/bash", "-c", "while true; do sleep 10; done;"]
######################################################################################
## PRE-RELEASE STAGE - compiles code and bundles the application to Erlang release ##
######################################################################################
FROM build AS pre-release
ARG APP_NAME
ARG APP_VSN
ENV APP_NAME=${APP_NAME} \
APP_VSN=${APP_VSN}
COPY . .
ENV PHOENIX_VERSION 1.4.3
RUN mix archive.install hex phx_new $PHOENIX_VERSION --force
RUN mkdir -p /opt/built \
&& mix do deps.get, compile --warnings-as-errors \
&& cd assets\
&& yarn install && yarn build \
&& cd .. \
&& mix do phx.digest, release --verbose \
&& cp /opt/cache/_build/${MIX_ENV}/rel/${APP_NAME}/releases/${APP_VSN}/${APP_NAME}.tar.gz /opt/built \
&& cd /opt/built \
&& tar -xzf ${APP_NAME}.tar.gz \
&& rm ${APP_NAME}.tar.gz
############################################
## RELEASE STAGE - production application ##
############################################
FROM debian:9-slim AS release
RUN apt-get update \
&& apt-get install -y \
libssl1.0-dev \
wget \
xz-utils \
libxrender1 \
libfontconfig \
libxext6 \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
RUN wget https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/0.12.4/wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
RUN tar vxf wkhtmltox-0.12.4_linux-generic-amd64.tar.xz
RUN cp wkhtmltox/bin/wk* /usr/local/bin/
# Install Aptible CLI tool.
RUN wget https://omnibus-aptible-toolbelt.s3.amazonaws.com/aptible/omnibus-aptible-toolbelt/master/187/pkg/aptible-toolbelt_0.16.2%2B20190829193224~ubuntu.16.04-1_amd64.deb
RUN dpkg -i aptible-toolbelt_0.16.2+20190829193224~ubuntu.16.04-1_amd64.deb
ARG APP_NAME
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8
RUN apt-get update && apt-get install -y \
bash git libpq-dev libjson-c-dev
ENV REPLACE_OS_VARS=true \
APP_NAME=${APP_NAME}
WORKDIR /opt/app
COPY ./priv/ua_inspector /opt/data/ua_inspector
COPY --from=pre-release /opt/built .
EXPOSE 4000
CMD trap 'exit' INT; /opt/app/bin/${APP_NAME} foreground