3

因此,我目前有一个设置,其中我部署了我的 dockerized Phoenix 应用程序以在自托管的 Drone 服务器上运行测试。目前出现的问题是,无论我使用什么 Dockerfile(当前是 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 实例化后运行命令在 Drone 的容器中安装 hex 和 rebar,则没有问题。我在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
4

1 回答 1

0

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

我设法通过MIX_HOME.drone.yml文件中设置来完成这项工作:

Dockerfile:

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
于 2019-03-29T07:06:02.033 回答