因此,我目前有一个设置,其中我部署了dockerized Phoenix应用程序以在自托管的Drone服务器上运行测试。当前出现的问题是,无论我使用什么Dockerfile(当前是alpine-elixir-phoenix或具有以下内容的基本elixir镜像),都将安装如下所示的十六进制/钢筋:
# Install Hex+Rebar
RUN mix local.hex --force && \
mix local.rebar --force
我在启动无人机后收到错误消息,
Could not find Hex, which is needed to build dependency :phoenix
我发现使用较旧版本的alpine-elixir-phoenix:2.0不会出现此问题,这使我相信这可能与从那时起更新的hex / elixir有关吗?此外,如果我实例化了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
在第29 && 30行的Dockerfile中发生了local.hex和local.rebar的相同安装。但是,在实例化容器时,找不到它,因此必须在CMD中再次运行。
此外,我再次遇到此问题,但是在 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
最佳答案
问题在于Drone会在Docker镜像之上建立自己的隔离工作环境作为额外的一层,因此ENV
中的Dockerfile
设置不可用。您需要独立地告诉Drone环境信息,以便知道十六进制的安装位置。
我设法通过在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
关于docker - 在无人机上运行时,无法在Dockerized Phoenix应用程序上找到十六进制,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43359182/