Невозможно запустить собственный скрипт при запуске контейнера - PullRequest
1 голос
/ 15 июня 2019

Я пытаюсь настроить Clair (инструмент для сканирования уязвимостей изображений Docker). https://github.com/coreos/clair

У меня Clair работает нормально локально, используя docker-compose. Проблема заключается в том, что при развертывании его в AWS мне необходимо указать адрес сервера postgres, имя пользователя и пароль и т. Д. Адрес сервера postgres неизвестен при создании образа, поэтому его нельзя включить при создании образа док-станции Clair. Его необходимо настроить при запуске контейнера / образа.

Для других приложений, использующих базу данных, я обычно просто настраиваю образ докера и добавляю скрипт (который запускается при запуске), который использует SED для вставки правильных значений (взятых из переменных среды) в файл конфигурации приложений.

Например:

Dockerfile

FROM quay.io/coreos/clair:latest

COPY /docker/clair/runtime.sh /runtime.sh
RUN chmod +x /runtime.sh

CMD ["/runtime.sh"]

runtime.sh

sed -i -e "s,#POSTGRES_SERVER#,$POSTGRES_SERVER,g" config.yaml

По какой-то причине описанный выше подход не будет работать с образом докера Clair. Этот подход работал для многих других основных изображений, поэтому я думаю, что это нечто особенное в образе Клэр.

Я не получаю никаких ошибок, он просто игнорирует CMD ["/runtime.sh"] в моем dockerfile и запускается, как обычно.

Кто-нибудь может указать, как я могу запустить свой собственный скрипт, или указать другой способ добиться того же?

=========== ОБНОВЛЕНИЕ С РЕШЕНИЕМ ===========

Проблема заключалась в том, что образ Clair основан на BusyBox, который по умолчанию использует оболочку ash, а сценарий оболочки, который я написал / использую, написан для оболочки bash. Возможно, это должно было быть очевидно, но я немного новичок в написании сценариев оболочки Linux и еще не сталкивался с этим.

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

Таким образом, решение, которое я использовал, было установить bash в образ, и тогда я смогу использовать мой обычный скрипт оболочки bash при запуске контейнера.

Dockerfile

FROM quay.io/coreos/clair:latest

RUN apk --no-cache upgrade
RUN apk add --no-cache curl py-pip bash postgresql-client figlet \
 && curl -L https://github.com/optiopay/klar/releases/download/v2.4.0/klar-2.4.0-linux-amd64 \
  > /usr/local/bin/klar \
 && chmod +x /usr/local/bin/klar \
 && pip install awscli

# Copy in custom Clair config file
COPY /docker/clair/config.yaml /etc/clair/config.yaml

# Env Vars for use with Klar CLI
ENV CLAIR_ADDR http://127.0.0.1:6060

# Copy runtime script & make it executable
COPY /docker/clair/runtime.sh /runtime.sh
RUN chmod +x /runtime.sh

# Override the parent images ENTRYPOINT
# Run a script on container startup which does a few things in addition to starting Clair at the end.
# Note, this script is a BASH script. It is critical that you install bash into the docker image or this script will
# fail with errors that are not very helpful.
ENTRYPOINT ["/runtime.sh"]

runtime.sh (небольшая выдержка)

#!/bin/bash

echo "======= Configuring config.yaml ====="
sed -i -e "s,#POSTGRES_USER#,$POSTGRES_USER,g" /etc/clair/config.yaml
sed -i -e "s,#POSTGRES_PASSWORD#,$POSTGRES_PASSWORD,g" /etc/clair/config.yaml
sed -i -e "s,#POSTGRES_URL#,$POSTGRES_URL,g" /etc/clair/config.yaml

/clair -config=/etc/clair/config.yaml

Ответы [ 2 ]

2 голосов
/ 15 июня 2019

Пожалуйста, проверьте this .

Помещение этой команды sed в dockerfile CMD должно работать.

CMD sed -i "s/localhost/$DB_HOST/" /config/config.yaml && exec /clair -config=/config/config.yaml

0 голосов
/ 15 июня 2019

Подход документация Clair , кажется, подтверждает, что нужно взять образец файла конфигурации из исходного дерева, настроить его по вкусу и вставить его в контейнер с docker run -v вариант.Таким образом, более или менее

docker network create clairnet
docker run -d \
  --net clairnet \
  --name clairpg \
  postgres:9.6
mkdir clair_config
sed 's/host=localhost/host=clairpg/' config.yaml.sample > clair_config/config.yaml
docker run -d \
  --net clairnet \
  -v $PWD/clair_config:/config \
  -p 6060:6060 \
  -p 6061:6061 \
  quay.io/coreos/clair:latest \
  -config=/config/config.yaml

(Это универсально полезный подход, который может быть проще, чем пытаться исправлять файлы конфигурации во время запуска контейнера.)

Возможно, вы отключеныПри выполнении этого в Kubernetes дерево исходных текстов также включает диаграмму Хелма, которая использует шаблоны Go для заполнения конфигурации в ConfigMap во время установки.Однако это очень специфичное для Kubernetes решение, и я бы не советовал запускать Kubernetes только для того, чтобы иметь возможность запускать вещи таким образом.

В противном случае вы застряли, глядя на Dockerfile изображения (в корне репозитория).Это включает следующую строку:

ENTRYPOINT ["/usr/bin/dumb-init", "--", "/clair"]

Если вы создаете производное изображение с его собственным CMD, оно передается в качестве дополнительных аргументов ENTRYPOINT, что в данном случае означает, что оно передается в качестве аргументовClair;вызывающий не может предоставить альтернативную команду, запустить оболочку отладки или в вашем случае внедрить дополнительный шаг времени запуска, не полностью переопределяя значение точки входа.

Вы можете обойти это, написав собственный скрипт точки входа.,Я бы предложил разделить команду для запуска (/clair) из шагов установки.Сценарий может выглядеть как

#!/bin/sh
# I am /docker-entrypoint.sh, with mode 0755
sed "s/host=localhost/host=$PGHOST/" /config/config.yaml.sample > /config/config.sample
exec /usr/bin/dumb-init -- "$@"

, а затем ваш производный Dockerfile будет выглядеть как

FROM quay.io/coreos/clair
COPY docker-entrypoint.sh /
RUN chmod 0755 /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
CMD ["/clair"]
...