在无人机上 运行 时无法在 Dockerized Phoenix App 上找到 Hex

Hex Cannot Be Found on Dockerized Phoenix App when running on Drone

所以我目前有一个设置,其中我将我的 dockerized Phoenix 应用程序部署到自托管 Drone 服务器上的 运行 测试。目前出现的问题是,无论我使用什么 Docker 文件(目前是 alpine-elixir-phoenix 或具有以下内容的基本 elixir 图像)都会安装 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 的容器中安装 hex 和 rebar 的命令一旦实例化就没有问题。我在实例化的 Drone 容器上 运行 a whoami,如果有区别的话,用户是 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 的相同安装出现在第 29 && 30 行的 Docker 文件中。但是在实例化容器时找不到它,因此必须运行 再次在 CMD 中。

此外,我又遇到了这个问题,但是 makeg++ 没有安装在 alpine 上。我可能做错了什么,但我看不到哪里。

testbuild_env Docker文件

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

问题在于 Drone 在您的 docker 图像之上构建了自己的隔离工作环境作为额外层,因此 Dockerfile 中的 ENV 设置不可用。您需要单独告诉 Drone 环境信息,以便它知道 hex 的安装位置。

我设法通过在 .drone.yml 文件中设置 MIX_HOME 来实现此功能:

Docker 文件:

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