Hex не может быть найден в приложении Dockerized Phoenix при работе на Drone

Итак, в настоящее время у меня есть установка, в которой я развертываю свое докеризованное приложение Phoenix для запуска тестов на собственном сервере Drone. В настоящее время возникает проблема, что независимо от того, какой Dockerfile я использую (в настоящее время alpine-elixir-phoenix или базовый образ эликсира со следующим), который устанавливает hex/rebar, как показано ниже:

# Install Hex+Rebar
    RUN mix local.hex --force && \
    mix local.rebar --force

Я получаю сообщение об ошибке при загрузке в Drone,

Could not find Hex, which is needed to build dependency :phoenix

Я обнаружил, что при использовании более старой версии alpine-elixir-phoenix:2.0 эта проблема не возникает, что наводит меня на мысль, что это может быть как-то связано с обновлением hex/elixir с тех пор? Кроме того, если я запускаю команды для установки шестигранника и арматуры в контейнере в Drone после его создания, проблем не возникает. Я запустил whoami на созданном контейнере Drone, и пользователь root, если это имеет значение. Кроме того, если я запускаю контейнер локально и запускаю mix hex.info, он правильно указывает, что hex установлен, однако проблема в том, что в контейнере, созданном Drone, это не удается.

Пример .drone.yml:

pipeline:
    backend_test:
    image: bitwalker/alpine-elixir-phoenix
        commands:
            - cd api
            - apk update
            - apk add postgresql-client
            - MIX_ENV=test mix local.hex --force
            - MIX_ENV=test mix local.rebar --force
            - MIX_ENV=test mix deps.get
            - MIX_ENV=test mix ecto.create
            - MIX_ENV=test mix ecto.migrate
            - mix test

Пример используемого файла Docker (bitwalker/alpine-elixir-phoenix) — https://github.com/bitwalker/alpine-elixir-phoenix/blob/master/Dockerfile

где такая же установка local.hex и local.rebar происходит в Dockerfile в строках 29 && 30. Однако при создании экземпляра контейнера он не найден, и поэтому его необходимо снова запустить в CMD.

Кроме того, я снова столкнулся с этой проблемой, но make и g++ не устанавливались на alpine. Возможно, я делаю что-то не так, но я не вижу, где.

testbuild_env Dockerfile

FROM bitwalker/alpine-erlang:19.2.1b
ENV HOME=/opt/app/ TERM=xterm

# Install Elixir and basic build dependencies
RUN \
echo "@edge http://nl.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories && \
apk update && \
apk --no-cache --update add \
  git make g++ curl \
  elixir@edge=1.4.2-r0 && \
rm -rf /var/cache/apk/*

# Install Hex+Rebar
RUN mix local.hex --force && \
mix local.rebar --force

ENV DOCKER_BUCKET test.docker.com
ENV DOCKER_VERSION 17.05.0-ce-rc1
ENV DOCKER_SHA256 4561742c2174c01ffd0679621b66d29f8a504240d79aa714f6c58348979d02c6

RUN set -x \
&& curl -fSL "https://${DOCKER_BUCKET}/builds/Linux/x86_64/docker-${DOCKER_VERSION}.tgz" -o docker.tgz \
&& echo "${DOCKER_SHA256} *docker.tgz" | sha256sum -c - \
&& tar -xzvf docker.tgz \
&& mv docker/* /usr/local/bin/ \
&& rmdir docker \
&& rm docker.tgz \
&& docker -v

COPY docker-entrypoint.sh /usr/local/bin/

ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["sh"]

со следующим .drone.yml

build:
    image: test_buildenv
    commands:
      - cd api
      - apk add make
      - apk add g++
      - MIX_ENV=test mix local.hex --force
      - MIX_ENV=test mix local.rebar --force
      - docker login --username USERNAME --password PASSWORD
      - mix docker.build # creates a release file after running a dockerfile.build image
      - mix docker.release # creates a minimalist image to run the release file that was just created
      - mix docker.publish # pushes newly created image to dokcerh
    volumes:
       - /var/run/docker.sock:/var/run/docker.sock

person Faolain    schedule 12.04.2017    source источник
comment
Я рекомендую предоставить минимальный yaml и dockerfile, необходимые для полного воспроизведения проблемы. Я также рекомендую прочитать readme.drone.io/usage/getting-started/#commands чтобы объяснить, как работает дрон. Пользователь определенно может иметь значение, если Hex должен быть в пользовательском PATH. Установка для пользователя A не обязательно означает, что она доступна для пользователя B. Но это всего лишь общий совет, так как я не знаю, как устанавливать вещи с помощью шестигранника / арматуры.   -  person Brad Rydzewski    schedule 12.04.2017
comment
Привет, Брэд, спасибо за отличную работу. Таким образом, я столкнулся с той же проблемой с отсутствующими make и g++, хотя они были включены в сам файл докеров (и установлены, когда изображение было создано, как видно из журналов), однако при создании экземпляра, где были необходимы make/g++, приложение вышло из строя. Добавление строк apk add make и apk add g++ позволяет компилировать приложение нормально... но теперь мне любопытно как для make/g++, так и для шестнадцатеричного... почему установки в файле docker недостаточно?   -  person Faolain    schedule 15.04.2017


Ответы (1)


Проблема в том, что Drone создает свою собственную изолированную рабочую среду в качестве дополнительного слоя поверх вашего образа докера, поэтому настройки ENV в вашем Dockerfile недоступны. Вам нужно самостоятельно сообщить Drone информацию об окружении, чтобы он знал, где установлен hex.

Мне удалось заставить это работать, установив MIX_HOME в файле .drone.yml:

Докерфайл:

FROM bitwalker/alpine-elixir:1.8.1
RUN mix local.hex --force

.drone.yml:

pipeline:
  build:
    image: # built image of the above Dockerfile
    environment:
      MIX_HOME: /opt/app/.mix
    commands:
      - mix deps.get
person Adam Millerchip    schedule 29.03.2019