Docker 在无人机上运行时,在停靠的Phoenix应用程序上找不到十六进制

Docker 在无人机上运行时,在停靠的Phoenix应用程序上找不到十六进制,docker,elixir,phoenix-framework,drone,Docker,Elixir,Phoenix Framework,Drone,因此,我目前有一个设置,其中我部署了我的Docked Phoenix应用程序,以便在自托管的无人机服务器上运行测试。目前出现的问题是,无论我使用什么Dockerfile(目前使用的是alpine elixir phoenix或带有以下内容的基本elixir图像),它都会安装hex/rebar,如下所示: # Install Hex+Rebar RUN mix local.hex --force && \ mix local.rebar --force 我在无人机

因此,我目前有一个设置,其中我部署了我的Docked Phoenix应用程序,以便在自托管的无人机服务器上运行测试。目前出现的问题是,无论我使用什么Dockerfile(目前使用的是alpine elixir phoenix或带有以下内容的基本elixir图像),它都会安装hex/rebar,如下所示:

# Install Hex+Rebar
    RUN mix local.hex --force && \
    mix local.rebar --force
我在无人机启动时收到错误

找不到十六进制,这是构建依赖项所需的:phoenix

我发现,通过使用旧版本的阿尔卑斯长生不老药凤凰:2.0,这个问题没有出现,这让我相信这可能与十六进制/长生不老药的更新有关?此外,如果我运行命令在容器内安装hex和rebar,一旦它被实例化,就没有问题了。我在实例化的无人机容器上运行了一个
whoami
,如果有区别的话,用户就是root。此外,如果我在本地运行容器并运行
mix hex.info
,它会正确地表示已安装hex,但问题是在无人机实例化的容器上,此操作失败

示例: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)-

其中,第29和30行的Dockerfile中出现了相同的local.hex和local.rebar安装。但是,在实例化容器时找不到它,因此必须在CMDs中再次运行

此外,我再次遇到了这个问题,但是没有在alpine上安装
make
g++
。我可能做了一些不正确的事情,但我看不出在哪里

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

问题是,无人机在docker图像的顶部构建了自己的隔离工作环境,因此,
docker文件中的
ENV
设置不可用。您需要独立地告诉Drone环境信息,以便它知道hex安装在何处

通过在
.drone.yml
文件中设置
MIX_HOME
,我成功地实现了这一点:

Dockerfile:

比特沃克/阿尔卑斯长生不老药:1.8.1 运行mix local.hex--force
.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
管道:
建造:
图像:#上述Dockerfile的构建图像
环境:
MIX\u HOME:/opt/app/.MIX
命令:
-混合饮料

我建议提供完整再现问题所需的最低yaml和dockerfile。我还建议阅读来解释无人机是如何工作的。如果Hex需要在用户路径中,那么用户肯定很重要。为用户A安装并不一定意味着它对用户B可用。但这只是一般性建议,因为我不知道如何安装hex/rebar。嘿,Brad,谢谢你的出色工作。因此,我最终遇到了同样的问题,即缺少
make
g++
,即使它包含在dockerfile本身中(并在通过日志创建映像时安装),但是在需要make/g++的实例中,应用程序失败。添加
apk add make
apk add g++
行可以使应用程序很好地编译…但是我现在很好奇make/g++和hex…为什么在dockerfile中安装还不够?