首页 > 解决方案 > 如何在多阶段 docker build 中访问克隆的 git repo?

问题描述

我有一个 dockerised logstash,我想添加一个额外的插件logstash-input-pulsar。该插件需要通过 git clone 下载,其依赖项需要使用 jruby 安装:

bundle install
rake install_jars

我想我可以先使用 git 映像来 git clone 插件,然后使用 jruby 映像 cd 到插件文件夹并安装 gems。但是,当我尝试 cd 进入插件文件夹时出现此错误:

/bin/sh: 1: cd: can't cd to logstash-input-pulsar

我尝试构建 Dockerfile 时的完整消息是:

[logstash (master)]$ docker build -t logstash .
Sending build context to Docker daemon  70.03MB
Step 1/10 : ARG ELK_VERSION
Step 2/10 : FROM alpine/git
 ---> f54f496311fb
Step 3/10 : RUN git clone https://github.com/se7enkings/logstash-input-pulsar
 ---> Using cache
 ---> 93b473ae8753
Step 4/10 : FROM jruby:9
 ---> 4e5c810afeb7
Step 5/10 : RUN cd logstash-input-pulsar
 ---> Running in c1b9158d91d0
/bin/sh: 1: cd: can't cd to logstash-input-pulsar
The command '/bin/sh -c cd logstash-input-pulsar' returned a non-zero code: 2

Dockerfile 是:

ARG ELK_VERSION

FROM alpine/git as intermediate
RUN git clone https://github.com/se7enkings/logstash-input-pulsar

FROM jruby:9
COPY --from=intermediate /logstash-input-pulsar /logstash-input-pulsar
RUN cd /logstash-input-pulsar
RUN bundle install
RUN rake install_jars

# https://www.docker.elastic.co/
FROM docker.elastic.co/logstash/logstash:${ELK_VERSION}
RUN echo 'gem "logstash-input-pulsar", :path => "logstash-input-pulsar"
RUN bin/logstash-plugin install --no-verify

我认为logstash-input-pulsar一旦 git 映像被破坏,该文件夹就不会持续存在。但是我不确定如何将这些命令链接在一起。

标签: docker

解决方案


似乎问题是由于在没有正确路径的基础图像上克隆造成的。

您可以在 Dockerfile 下尝试,它应该可以工作。

FROM alpine/git as intermediate
WORKDIR /app
RUN git clone https://github.com/se7enkings/logstash-input-pulsar

FROM jruby:9
COPY --from=intermediate /app/ /app
WORKDIR /app/logstash-input-pulsar
RUN bundle install
RUN rake install_jars


推荐阅读