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



所以我目前有一个设置,其中我部署了我的 dockerized Phoenix 应用程序以在自托管的无人机服务器上运行测试。目前出现了一个问题,无论我使用什么 Dockerfile(目前是高山长生不老药或具有以下基础长生不老药的图像)都会安装十六进制/钢筋,如下所示:

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

我在无人机中启动时收到错误,

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

我发现通过使用旧版本的高山长生不老药-凤凰:2.0,这个问题不会出现,这让我相信这可能与从那时起更新的十六进制/长生不老药有关?此外,如果我运行命令在实例化后在 Drone 的容器内安装十六进制和钢筋,则没有问题。我在实例化的 Drone 容器上运行了一个whoami,如果这有所作为,用户就是 root。此外,如果我在本地运行容器并运行mix hex.info,它正确地指出已安装十六进制,但问题是在 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中再次运行。

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

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

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

我设法通过在.drone.yml文件中设置MIX_HOME来使其工作:

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

最新更新