сбой при запуске образа docker, ipmi_exporter для Prometheus

#docker #prometheus

#docker #prometheus

Вопрос:

Я пытаюсь создать образ docker soundcloud / ipmi-exporter для запуска с Prometheus на Ubuntu Bionic с помощью Docker 19.03.6, сборка 369ce74a3c. Docker на моем ноутбуке OS X — это Docker версии 20.10.2, сборка 2291f61. Я вынужден создать (настроенный) образ на своем ноутбуке, потому что у Bionic есть версия golang, которая старше, чем требуется ipmi-exporter, и мне не разрешено обновлять сервер Ubuntu.

В любом случае, может кто-нибудь сказать мне, что я делаю не так в моем Dockerfile?

 # Container image
FROM quay.io/prometheus/golang-builder:1.13-base AS builder
ADD . /go/src/github.com/soundcloud/ipmi_exporter/
RUN cd /go/src/github.com/soundcloud/ipmi_exporter amp;amp; make

# Container image
FROM ubuntu:18.04
WORKDIR /
RUN apt-get update amp;amp; apt-get install freeipmi-tools -y --no-install-recommends amp;amp; rm -rf /var/lib/apt/lists/*

COPY --from=builder /go/src/github.com/soundcloud/ipmi_exporter/ipmi_exporter /bin/ipmi_exporter

EXPOSE 8888
ENTRYPOINT ["ipmi_exporter"]
CMD ["--config.file", "/ipmi_remote.yml"]
CMD ["--web.listen-address=":8889"" "--freeipmi.path=/etc/freeipmi" "--log.level="debug""]
 

Когда я запускаю изображение, все, что я вижу, это

 ipmi_exporter: error: unexpected /bin/sh, try --help
 

У меня ipmi_exporter запущен непосредственно в ОС, и я никогда не настраивал config.yml. О каком config.yml говорит автор файла Dockerfile? Это упоминается в последней строке https://github.com/soundcloud/ipmi_exporter/blob/master/Dockerfile

Изображение находится здесь: https://github.com/soundcloud/ipmi_exporter Пример / пример Dockerfile ссылается на файл config.yaml, который это программное обеспечение не использует.

Я просто не могу понять, как заставить изображение извлекаться из указанного мной файла конфигурации.

Комментарии:

1. У вас есть два CMD s; первый игнорируется. Второй не является допустимым массивом JSON, поэтому Docker оборачивает его sh -c '["--web.listen-address...""]' . Затем это передается в качестве дополнительных аргументов для single ENTRYPOINT . Возможно, было бы проще просто написать один CMD ipmi_exporter --web.listen-address=:8889 ... (без ENTRYPOINT синтаксиса JSON-массива и без него).

2. Распространяемый файл Dockerfile содержит строку CMD [«—config.file», «/config.yml»], но с этим изображением не распространяется файл config.yml. Кроме того, когда я использую CMD [«—config.file», «/ipmi_remote.yml»], результирующее изображение не может найти файл, который абсолютно существует в каталоге сборки. Я вообще не понимаю пути к docker.

3. Вы имели в виду буквально CMD ipmi_exporter —web.listen-address=:8889 без скобок?

4. Да, когда вы docker run создаете изображение, оно будет интерпретироваться как обычная командная строка.

5. Если вы это сделаете, это должен быть допустимый массив JSON, иначе Docker вернется к обработке его как команды оболочки. В форме в вопросе есть двойные двойные кавычки и пропущенные запятые между элементами массива. Также, если у вас есть оба ENTRYPOINT , и CMD тогда ENTRYPOINT должна быть форма JSON-массива. Документация Dockerfile ENTRYPOINT содержит более подробную информацию; синтаксис там также применим к CMD и RUN .