Объемы контейнера содержат название контейнера в пути монтирования, так что в основном вы можете создать сценарий точки входа в своем 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 будет соответствовать этому.
Вот шаги, которые я сделал:
- Создайте сценарий точки входа, который проверяет наличие объема, используя
df
команду (см пример entrypoint.sh
файл ниже)
- Создать
Dockerfile
и добавьте ENTRYPOINT
команду для запуска сценария точки входа (см. пример Dockerfile
файл ниже)
Создайте новое изображение и нажмите в реестр 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
Создание тома - имя тома соответствует проверка в точке сценария входа, например:
$ cf ic volume create adsdatabase
Создать новый контейнер и добавить новый объем:
$ 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"]
Спасибо. Я уже делал это до того, как вы это написали. Проблема состояла в том, что я сначала пытался локально использовать только Docker. Но с bluemix вы можете получить громкость. Больше, чем df, рекомендую mount | grep nfs4. – bartimar
Используя nfs4, вы будете в зависимости от технологии, теоретически это может измениться прозрачно, и ваш скрипт не будет скриптом. Используйте имя тома, предложенное Алексом, это действительно более портативно –
Мне не важно имя тома. Я забочусь о том, что любой объем, связанный с/var/lib/mysql внутри контейнера ... – bartimar