2016-02-18 6 views
1

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

У меня есть контейнер mysql и вы хотите заблокировать запуск контейнера (выход с ошибкой), где нет тома, подключенного к/var/lib/mysql для размещения тома. В IBM Bluemix есть опция для добавления тома в контейнер с указанным контуром контейнера. Мне нужно предотвратить запуск контейнера, если кто-то забудет добавить том.

В качестве альтернативы можно ли узнать, есть ли объем от хоста к контейнеру внутри контейнера? (Добавление проверки к точке входа)

ответ

2

Объемы контейнера содержат название контейнера в пути монтирования, так что в основном вы можете создать сценарий точки входа в своем Dockerfile, который проверяет наличие имени тома. Я использовал df | grep volume-name, чтобы проверить, установлен ли том в сценарии точки входа. Это пример запуска df на контейнере с объемом установлен (объем здесь adsdatabase):

# df 
Filesystem 1K-blocks Used Available Use% Mounted on 
/dev/mapper/docker-8:16-212573961-302136b327f5923d7c9b8c6c2cf62c0783 10190136 466892 9182572 5%/
tmpfs 132022832 0 132022832 0% /dev 
shm 65536 0 65536 0% /dev/shm 
nfsdal0901d.service.softlayer.com:/IBM01SV531277_366/adsdatabase 20971520 23168 20948352 1% /data 
/dev/sdb 11522552336 200321280 10741487072 2% /etc/hosts 
udev 132009268 4 132009264 1% /dev/tty 

Я рекомендую вам не использовать общее название, как «данные», для имени тома или Grep будет соответствовать этому.

Вот шаги, которые я сделал:

  1. Создайте сценарий точки входа, который проверяет наличие объема, используя df команду (см пример entrypoint.sh файл ниже)
  2. Создать Dockerfile и добавьте ENTRYPOINT команду для запуска сценария точки входа (см. пример Dockerfile файл ниже)
  3. Создайте новое изображение и нажмите в реестр Bluemix, например:

    $ docker build -t ads-volumesample . $ docker tag ads-volumesample registry.ng.bluemix.net/namespace/ads-volumesample $ docker push registry.ng.bluemix.net/namespace/ads-volumesample

  4. Создание тома - имя тома соответствует проверка в точке сценария входа, например:

    $ cf ic volume create adsdatabase

  5. Создать новый контейнер и добавить новый объем:

    $ cf ic run -v adsdatabase:/data --name ads-volumesample1 registry.ng.bluemix.net/namespace/ads-volumesample

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

точка входа.ш

#!/bin/bash 
set -e 

if df | grep adsdatabase > /dev/null; then 
    echo "Found volume" 
else 
    echo "Volume not found" 
    exit 1 
fi 

exec "[email protected]" 

Dockerfile

FROM registry.ng.bluemix.net/ibmnode 

ADD ./app /node 

ENV NODE_ENV production 

RUN cd /node && npm install 
COPY entrypoint.sh/
ENTRYPOINT ["/entrypoint.sh"] 

EXPOSE 3000 

CMD ["node", "/node/app.js"] 
+0

Спасибо. Я уже делал это до того, как вы это написали. Проблема состояла в том, что я сначала пытался локально использовать только Docker. Но с bluemix вы можете получить громкость. Больше, чем df, рекомендую mount | grep nfs4. – bartimar

+0

Используя nfs4, вы будете в зависимости от технологии, теоретически это может измениться прозрачно, и ваш скрипт не будет скриптом. Используйте имя тома, предложенное Алексом, это действительно более портативно –

+0

Мне не важно имя тома. Я забочусь о том, что любой объем, связанный с/var/lib/mysql внутри контейнера ... – bartimar

1

Вы можете просто запустить скрипт, который проверяет, содержит ли путь, в котором должен быть установлен том (/ var/lib/mysql в вашем случае), содержит тома (он подтверждает, что громкость установлена ​​правильно) Имейте в виду, что: - путь монтирования тома существует, даже если громкость не установлена, вы должны проверить его содержимое, а не сам путь - если вы запустите процесс инициализации при первом запуске том, что в этот момент объем пуст, и точка монтирования тоже пуста: так пропустите проверку при инициализации или укажите конкретный случай для этого

+0

Как я могу проверить из контейнера-то, что полностью вне контейнера? – bartimar

+0

Или вы имеете в виду, что сначала имеете что-то в подключенном томе? И тогда стартовый контейнер проверяет, есть ли он там? – bartimar

+0

точно. Вы можете проверить смонтированную файловую систему, а тома Bluemix смонтированы через NFS, но это не очень портативно. Итак, у вас может быть больше портативных - проверка содержимого точки монтирования тома, когда ожидается, что она будет инициализирована (созданная база данных и данные вставлены): это означает, что при запуске вашего контейнера проверьте путь/var/lib/mysql (если это точка монтирования тома), и если она пуста (так что том не был прикреплен к контейнеру), не будет запускаться база данных mysql –

Смежные вопросы