Intereting Posts
После загрузки изображения из «Docker Hub», куда я должен поместить свой файл конфигурации? В объеме данных? Craft CMS Manager Craftman – Нет такого файла или каталога: '//docker-compose.yml' Не удалось получить доступ к пользовательскому интерфейсу Kubernetes Как запустить контейнер python-flask в Mac OS? Как я могу исправить Docker / Mac без пробела на ошибке устройства? Контейнерные выходы при вызове из состава docker compose- как установить свойство name Автоматическая сборка Docker Ошибка: сбой сборки: файл Docker не найден в ./Dockerfile Postfix в контейнере Docker не может разрешить MX, если он не перезапустится один раз Как переместить докерную сеть из старого в новый контейнер? Как указать изображение докеров в мой каталог .m2 для запуска maven в докере на Mac? Общая память в контейнерах докеров Docker сохраняет / загружает исходный репозиторий изображений / имя / тег Прикрепленное приложение Node.js Каковы минимальные требования к neo4j?

Понимание сценария точки входа в докер

Сценарий находится здесь: https://github.com/docker-library/ghost/blob/master/docker-entrypoint.sh

#!/bin/bash set -e if [[ "$*" == npm*start* ]]; then baseDir="$GHOST_SOURCE/content" for dir in "$baseDir"/*/ "$baseDir"/themes/*/; do targetDir="$GHOST_CONTENT/${dir#$baseDir/}" mkdir -p "$targetDir" if [ -z "$(ls -A "$targetDir")" ]; then tar -c --one-file-system -C "$dir" . | tar xC "$targetDir" fi done if [ ! -e "$GHOST_CONTENT/config.js" ]; then sed -r ' s/127\.0\.0\.1/0.0.0.0/g; s!path.join\(__dirname, (.)/content!path.join(process.env.GHOST_CONTENT, \1!g; ' "$GHOST_SOURCE/config.example.js" > "$GHOST_CONTENT/config.js" fi ln -sf "$GHOST_CONTENT/config.js" "$GHOST_SOURCE/config.js" chown -R user "$GHOST_CONTENT" set -- gosu user "$@" fi exec "$@" 

Из того, что я знаю, в нем говорится, что если вы используете некоторые варианты npm start перемещать некоторые файлы из $GHOST_SOURCE в $GHOST_CONTENT , сделайте что-нибудь в файле config.js , свяжите файл конфигурации, установите права собственности на файлы содержимого и затем выполните npm start в качестве пользователя user . В противном случае он просто запускает ваши команды в обычном режиме.

Специфика – это то, что мне трудно понять, потому что из bash есть много вещей, которые я никогда раньше не видел. Поэтому у меня много вопросов.

 for dir in "$baseDir"/*/ "$baseDir"/themes/*/; do 

В приведенном выше, почему они указывают как /*/ и /themes/*/ ? Не должны /*/ содержать темы? Почему-то не является подстановочным знаком?

 targetDir="$GHOST_CONTENT/${dir#$baseDir/}" 

В вышесказанном, какова точка # в переменном расширении?

 tar -c --one-file-system -C "$dir" . | tar xC "$targetDir" 

В приведенном выше, это как-то экономит время? Почему бы не использовать что-то вроде rsync? Я понимаю суть -C , но почему -c и --one-file-system ?

 sed -r ' s/127\.0\.0\.1/0.0.0.0/g; s!path.join\(__dirname, (.)/content!path.join(process.env.GHOST_CONTENT, \1!g; ' "$GHOST_SOURCE/config.example.js" > "$GHOST_CONTENT/config.js" 

Что делает команда sed ? Я знаю, что это замена, но почему "$GHOST_SOURCE/config.example.js" > "$GHOST_CONTENT/config.js" в конце?

 ln -sf "$GHOST_CONTENT/config.js" "$GHOST_SOURCE/config.js" 

В приведенном выше, в чем смысл этой символической ссылки? Зачем пытаться связать их друг с другом, если оба файла уже существуют?

 set -- gosu user "$@" 

В приведенном выше случае, что делает set вызовов без аргументов?

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

     for dir in "$baseDir"/*/ "$baseDir"/themes/*/; do 

    В приведенном выше, почему они указывают как /*/ и /themes/*/ ? Не должны /*/ содержать темы? Почему-то не является подстановочным знаком?

    темы / находится в первом совпадении, но темы / * / нет, поэтому вам нужна вторая запись, чтобы включить содержание тем.

     targetDir="$GHOST_CONTENT/${dir#$baseDir/}" 

    В вышесказанном, какова точка # в переменном расширении?

    Он удаляет префикс $ baseDir из $ dir. Так, например:

     bash$ dir=/home/bmitch/data/docker bash$ echo $dir /home/bmitch/data/docker bash$ echo ${dir#/home/bmitch} /data/docker 
     tar -c --one-file-system -C "$dir" . | tar xC "$targetDir" 

    В приведенном выше, это как-то экономит время? Почему бы не использовать что-то вроде rsync? Я понимаю суть -C, но почему -c и -one-file-system?

    rsync не может быть установлен на каждом компьютере по умолчанию, tar довольно универсален. -c – создавать, vs extract и –on-file-system избегает tar, продолжая внешнюю точку монтирования (nfs, symlink для root и т. Д.).

     sed -r ' s/127\.0\.0\.1/0.0.0.0/g; s!path.join\(__dirname, (.)/content!path.join(process.env.GHOST_CONTENT, \1!g; ' "$GHOST_SOURCE/config.example.js" > "$GHOST_CONTENT/config.js" 

    Что делает команда sed? Я знаю, что это замена, но почему «$ GHOST_SOURCE / config.example.js»> «$ GHOST_CONTENT / config.js» в конце?

    config.example.js – это вход (последний аргумент для sed), config.js – результат (после>). Таким образом, он принимает config.example.js, меняет ip-адрес от 127.0.0.1 до 0.0.0.0, эффективно прослушивая все интерфейсы / ip, а не только внутри loopback. Вторая половина sed меняет аргументы path.join с __dirname на process.env.GHOST_CONTENT.

     ln -sf "$GHOST_CONTENT/config.js" "$GHOST_SOURCE/config.js" 

    В приведенном выше, в чем смысл этой символической ссылки? Зачем пытаться связать их друг с другом, если оба файла уже существуют?

    $ GHOST_SOURCE / config.js заменяется (-f) ссылкой на $ GHOST_CONTENT / config.js. Символьные ссылки дают ссылку на имя файла для другого фактического файла, поэтому будут два имени, но одна копия данных, а это означает, что в этой ситуации у вас будет только одна конфигурация.

     set -- gosu user "$@" 

    В приведенном выше случае, что делает набор вызовов без аргументов?

    Это изменяет значения $ 1, $ 2, … $ n как $ 1 = gosu, $ 2 = user, $ 3 = старый $ 1, $ 4 = старый $ 2 …, по существу добавляя госу и пользователя к началу передал параметры сценарию. The – гарантирует, что набор не интерпретирует значения из $ @ как флаг для себя.