Help please! I’m running fly launch but getting stuck at the mix phx.gen.release --docker stage. The error code is (RuntimeError) couldn't fetch https://hub.docker.com/v2/namespaces/hexpm/repositories/elixir/tags?name=1.15.7-erlang-26.0.2-debian-bullseye-
I got a feeling it’s my VPN issue since i’m in China. For example I’m unable to run curl -I https://docker.com/ on my vscode cli console. However, I can access docker no problem with my browser.
I have 2 options.
Option 1: Dont use fly launch
I can run the mix phx.gen.release then manually write the docker file. Problem is all the tutorials I see requires me to run fly launch regardless. This means it still gets stuck at the docker stage. Is there another option other than fly launch?
Option 2: Make sure I can call docker.com from my vscode cli
I suspect the call is failing because of my VPN issue. If I can fix this, I can just run the standard fly launch and this would be no problem. Except I’m super confused on how to do this with vscode. What I do know is my VPN listens on a http proxy 59527
Hmmm, so what I did was update phoenix version in my mix.exs file. But I dont think changing the project will affect anything? Correct me if i’m wrong please. I thought that if any fixes was made to the mix phx.gen.release --docker command, it will be through a version bump for elixir, not phoenix.
Regardless, I bumped up the phoenix version to 1.7.10 just to try. Here’s the full error:
Side note: It seems the phoenix version is dictated by my elixir version. This can be seen from the error: (phoenix 1.7.10) lib/mix/tasks/phx.gen.release.ex:205: Mix.Tasks.Phx.Gen.Release.gen_docker/1. Doesnt matter which version I set for my project
Yea you are correct I was just hoping it was something more haha.
Your situation is definitely unique, I’m not sure how we can get past it being blocked… the dockerfile template is here
you’d have to set the values manually in the template, or here is the Dockerfile from my machine when I run it.
# 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-20230612-slim - for the release image
# - https://pkgs.org/ - resource for finding needed packages
# - Ex: hexpm/elixir:1.15.1-erlang-26.0.2-debian-bullseye-20230612-slim
#
ARG ELIXIR_VERSION=1.15.1
ARG OTP_VERSION=26.0.2
ARG DEBIAN_VERSION=bullseye-20230612-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 \
&& apt-get clean && rm -f /var/lib/apt/lists/*_*
# prepare build dir
WORKDIR /app
# install hex + rebar
RUN mix local.hex --force && \
mix local.rebar --force
# set build ENV
ENV MIX_ENV="prod"
# 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
# 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 \
&& apt-get clean && rm -f /var/lib/apt/lists/*_*
# 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
# set runner ENV
ENV MIX_ENV="prod"
# Only copy the final release from the build stage
COPY --from=builder --chown=nobody:root /app/_build/${MIX_ENV}/rel/hello_worlc ./
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"]
Thank you for sharing the dockerfile. I would still face the problem of deploying it to fly.io. That is because I need to run the fly launch command, which will eventually run mix phx.gen.release --docker under the hood. This means it will get stuck and I cannot create my fly app. Do you have any suggestions on this?
Before I saw your reply, I tried running just mix phx.gen.release and I copied your Dockerfile and .dockerignore file. Then I ran flyctl launch --dockerfile ./Dockerfile. It was able to push to fly successfully I think. The app status currently shows “suspended” which I think means it’s pushed successfully but crashed.
Happy to get new errors:
WARNING The app is not listening on the expected address and will not be reachable by fly-proxy.
You can fix this by configuring your app to listen on the following addresses:
- 0.0.0.0:8080
Thank you very much for the help!!! I’m almost there.
I’m only getting this error now:
(Postgrex.Error) ERROR 42P01 (undefined_table) relation "musics" does not exist
Does this mean my app is connected to my DB?
Locally I know this means I need to do ecto.create then do ecto.migrate. I’m unsure how to do in on fly.io though. Am I somehow suppose to add it into the Dockerfile like this?: