Синтаксическая ошибка при компиляции cowboy для проекта elixir

#docker #erlang #elixir #phoenix #cowboy

#docker #erlang #elixir #феникс #cowboy

Вопрос:

У меня есть Dockerfile, который создает проект elixir. Здесь я компилирую оба erlang и elixir из исходного кода. После этого я просто запускаю docker build --build-arg ... new-image . , и он работает без каких-либо ошибок. Пожалуйста, смотрите ниже

 FROM centos:8.2.2004

ARG APP_NAME
ARG APP_VSN
ARG MIX_ENV=prod

ENV APP_NAME=${APP_NAME} 
    APP_VSN=${APP_VSN} 
    MIX_ENV=${MIX_ENV}

RUN yum -y update
RUN yum -y upgrade
RUN yum -y install 
          nodejs  
          git 
          gcc gcc-c   make 
          ncurses-devel 
          cmake 
          openssl-devel 
          autoconf 
          zip 
          bzip2 
          readline-devel 
          jq 
          npm 
          amp;amp; yum clean all

ENV ERLANG_VERSION=21.1.1
ENV ELIXIR_VERSION=1.8.2
ENV RUBY_VERSION=2.4.3
ENV ERL_AFLAGS="-kernel shell_history enabled"

ARG DISABLED_APPS='megaco wx debugger jinterface orber reltool observer et'
ARG ERLANG_TAG=OTP-${ERLANG_VERSION}
ARG ELIXIR_TAG=v${ELIXIR_VERSION}

LABEL erlang_version=$ERLANG_VERSION erlang_disabled_apps=$DISABLED_APPS elixir_version=$ELIXIR_VERSION ruby_version=$RUBY_VERSION

RUN yum update -y amp;amp; yum clean all
RUN yum reinstall -y glibc-common amp;amp; yum clean all

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

RUN yum -y install glibc-locale-source glibc-langpack-en
RUN localedef -i en_US -f UTF-8 en_US.UTF-8

RUN locale

# Install Erlang
RUN set -xe 
    cd /tmp 
    amp;amp; git clone --branch $ERLANG_TAG --depth=1 --single-branch https://github.com/erlang/otp.git 
    amp;amp; cd otp 
    amp;amp; echo "ERLANG_BUILD=$(git rev-parse HEAD)" >> /info.txt 
    amp;amp; echo "ERLANG_VERSION=$(cat OTP_VERSION)" >> /info.txt  
    amp;amp; for lib in ${DISABLED_APPS} ; do touch lib/${lib}/SKIP ; done 
    amp;amp; ./otp_build autoconf 
    amp;amp; ./configure 
        --enable-smp-support 
        --enable-m64-build 
        --disable-native-libs 
        --enable-sctp 
        --enable-threads 
        --enable-kernel-poll 
        --disable-hipe 
    amp;amp; make -j$(nproc) 
    amp;amp; make install 
    amp;amp; find /usr/local -name examples | xargs rm -rf 
    amp;amp; ls -d /usr/local/lib/erlang/lib/*/src | xargs rm -rf 
    amp;amp; rm -rf 
       /otp/* 
      /tmp/*

# Install Elixir
RUN cd /tmp 
    amp;amp; git clone https://github.com/elixir-lang/elixir.git 
    amp;amp; cd elixir

RUN git clone --branch $ELIXIR_TAG --depth=1 --single-branch https://github.com/elixir-lang/elixir.git 
    amp;amp; cd elixir 
    amp;amp; echo "ELIXIR_BUILD=$(git rev-parse HEAD)" >> /info.txt 
    amp;amp; echo "ELIXIR_VERSION=$(cat VERSION)" >> /info.txt  
    amp;amp; make -j$(nproc) compile 
    amp;amp; rm -rf .git 
    amp;amp; make install 
    amp;amp; cd / 
    amp;amp; rm -rf 
      /tmp/*

RUN  mix local.rebar --force
RUN  mix local.hex --force

# This copies our app source code into the build container
COPY . .

RUN mix do deps.get, deps.compile, compile, phx.digest

RUN echo $MIX_ENV
RUN echo $APP_NAME
RUN echo $APP_VSN

RUN 
  mix release --verbose amp;amp; 
  cp _build/${MIX_ENV}/rel/${APP_NAME}/releases/${APP_VSN}/${APP_NAME}.tar.gz ${APP_DIR} amp;amp; 
  tar -xzf ${APP_NAME}.tar.gz amp;amp; 
  rm ${APP_NAME}.tar.gz
 

Сборка успешно завершена, и был создан новый образ с именем new-image . Естественно, я хочу повторно использовать new-image для других проектов. Итак, я создал новый Dockerfile imported из new-image и удалил команды для сборки elixir и erlang . Я понял, что все в порядке, поскольку я уже скомпилировал двоичные файлы во время предыдущей сборки, поэтому двоичные файлы elixir и erlang уже должны присутствовать в сборке, верно?. И файл Dockerfile заканчивается так, как показано ниже

 FROM new-image # created above

ARG APP_NAME
ARG APP_VSN
ARG MIX_ENV=prod

ENV APP_NAME=${APP_NAME} 
    APP_VSN=${APP_VSN} 
    MIX_ENV=${MIX_ENV}

RUN yum -y update
RUN yum -y upgrade
RUN yum -y install 
          nodejs  
          git 
          gcc gcc-c   make 
          ncurses-devel 
          cmake 
          openssl-devel 
          autoconf 
          zip 
          bzip2 
          readline-devel 
          jq 
          npm 
          amp;amp; yum clean all

ENV ERLANG_VERSION=21.1.1
ENV ELIXIR_VERSION=1.8.2
ENV RUBY_VERSION=2.4.3
ENV ERL_AFLAGS="-kernel shell_history enabled"

ARG DISABLED_APPS='megaco wx debugger jinterface orber reltool observer et'
ARG ERLANG_TAG=OTP-${ERLANG_VERSION}
ARG ELIXIR_TAG=v${ELIXIR_VERSION}

LABEL erlang_version=$ERLANG_VERSION erlang_disabled_apps=$DISABLED_APPS elixir_version=$ELIXIR_VERSION ruby_version=$RUBY_VERSION

RUN yum update -y amp;amp; yum clean all
RUN yum reinstall -y glibc-common amp;amp; yum clean all

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

RUN yum -y install glibc-locale-source glibc-langpack-en
RUN localedef -i en_US -f UTF-8 en_US.UTF-8

RUN locale

RUN  mix local.rebar --force
RUN  mix local.hex --force

# This copies our app source code into the build container
COPY . .

RUN mix do deps.get, deps.compile, compile, phx.digest

RUN echo $MIX_ENV
RUN echo $APP_NAME
RUN echo $APP_VSN

RUN 
  mix release --verbose amp;amp; 
  cp _build/${MIX_ENV}/rel/${APP_NAME}/releases/${APP_VSN}/${APP_NAME}.tar.gz ${APP_DIR} amp;amp; 
  tar -xzf ${APP_NAME}.tar.gz amp;amp; 
  rm ${APP_NAME}.tar.gz
 

И когда я строю из него сейчас, я получаю следующую синтаксическую ошибку при компиляции cowboy.

 All dependencies are up to date
===> Compiling ranch
===> Compiling telemetry
===> Compiling cowlib
===> Compiling cowboy
Compiling 28 files (.ex)

== Compilation error in file lib/phoenix-1.4.1/priv/templates/phx.gen.channel/channel.ex ==
** (SyntaxError) lib/phoenix-1.4.1/priv/templates/phx.gen.channel/channel.ex:1: syntax error before: '='
    (elixir) lib/kernel/parallel_compiler.ex:208: anonymous fn/4 in Kernel.ParallelCompiler.spawn_workers/6
The command '/bin/sh -c mix do deps.get, deps.compile, compile, phx.digest' returned a non-zero code: 1
 

P.S. У меня не установлен ruby 2.4.3, не понимаю, зачем здесь нужен ruby. Кроме того, это первый раз, когда я вижу проект erlang. Поэтому, пожалуйста, будьте проще со мной.

Редактировать: добавление файла шаблона ( lib/phoenix-1.4.1/priv/templates/phx.gen.channel/channel.ex )

 defmodule <%= module %>Channel do
  use <%= web_module %>, :channel

  def join("<%= singular %>:lobby", payload, socket) do
    if authorized?(payload) do
      {:ok, socket}
    else
      {:error, %{reason: "unauthorized"}}
    end
  end

  # Channels can be used in a request/response fashion
  # by sending replies to requests from the client
  
 

Комментарии:

1. Можете ли вы опубликовать первые пару строк файла: lib/phoenix-1.4.1/priv/templates/phx.gen.channel/channel.ex

2. @7stud Отредактировал вопрос в соответствии с вашим запросом

Ответ №1:

Вы пытаетесь скомпилировать файл шаблона. Файл шаблона содержит синтаксис, который не является elixir. Файл шаблона должен быть запущен через препроцессор, чтобы удалить <%= ... %> теги и заменить их допустимым синтаксисом elixir. Смотрите EEx в elixir . По сути, файл представляет собой строку, которую можно запустить через механизм EEx для замены этих тегов возвращаемым значением кода elixir, содержащегося внутри этих тегов.

Комментарии:

1. Я согласен с тем, что вы сказали. Просто я не выполняю никакой предварительной обработки EEx в своем первом Dockerfile, и все же, похоже, он работает нормально. Можете ли вы объяснить это более простым способом, потому что я не внес никаких изменений, кроме удаления строк, которые создают elixir и erlang. Файл шаблона уже присутствовал для предыдущей успешной сборки