"Нет такого файла или каталога" сразу после его создания

"Нет такого файла или каталога" сразу после его создания

26.01.2020 11:18:37 Просмотров 31 Источник

Какая-то предыстория...

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

В файле README плагина storage adapter инструкции по установке состоят в том, чтобы скопировать модуль в рабочий каталог приложения:

npm install ghost-storage-adapter-s3
mkdir -p ./content/adapters/storage
cp -r ./node_modules/ghost-storage-adapter-s3 ./content/adapters/storage/s3

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

Вопрос

В моем Докерфайле у меня есть:

FROM ghost:3
RUN npm install ghost-storage-adapter-s3
RUN mkdir -p ./content/adapters/storage
RUN cp -r ./node_modules/ghost-storage-adapter-s3/ ./content/adapters/storage/s3

и он выдает эту ошибку: cp: cannot create directory './content/adapters/storage/s3': No such file or directory

Когда я делаю шаг назад и пытаюсь создать один каталог за раз и проверить, что он был создан, т. е.

RUN ls ./content
RUN mkdir ./content/adapters
RUN ls ./content/adapters

Я получаю эту ошибку:

Step 8/10 : RUN ls ./content/adapters
 ---> Running in c55848f39bb4
ls: cannot access './content/adapters': No such file or directory
The command '/bin/sh -c ls ./content/adapters' returned a non-zero code: 2

Как это возможно ,что после того, как я его только что создал," нет такого каталога"?

Я попытался установить разрешения chmod при создании папки mkdir -m 777 ./content/adaptersи обновление владельца до моего текущего пользователя (root): RUN chown -R root ./content, но без эффекта.

Я смог заставить его, по крайней мере, построить, изменив ./префиксы каталога/, но это помещает /content в корневой каталог приложения, который не находится там, где они должны быть. Когда я указываю полный путь /var/lib/ghost/content/adapters/storage, я получаю ту же ошибку. Кажется, это было бы хорошо, но я не знаю.

Любая помощь будет очень признательна.

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/59916656/no-such-file-or-directory-immediately-after-creating-it#comment105957812_59916656
@funnydman я не хочу, чтобы мой образ docker зависел от контейнера хоста, он должен быть в состоянии построить все, что ему нужно, самостоятельно

Ответы - "Нет такого файла или каталога" сразу после его создания / "No such file or directory" immediately after creating it

Wonkledge

26.01.2020 11:59:26

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

David Maze

26.01.2020 02:20:17

Это типичный признак базового образа, объявляющего том для своего каталога установки. Вы не можете создать производный образ, который имеет какое-либо дополнительное содержимое в этом каталоге, плагины или иным образом.

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

docker run --rm -it -v $PWD/ghost:/var/lib/ghost/content ghost:3 bash
npm install ghost-storage-adapter-s3
mkdir -p ./content/adapters/storage
cp -r ./node_modules/ghost-storage-adapter-s3/ ./content/adapters/storage/s3
exit

docker run -d -p 2368:2368 -v $PWD/ghost:/var/lib/ghost/content ghost:3

Если вы хотите сделать это повторно, то (как отмечает @Wonkledge в своем ответе) вы можете использовать скрипт entrypoint, чтобы скопировать это при запуске, после того, как все тома были присоединены к контейнеру. Обратите внимание, что изображение уже объявляет свою собственную точку входа, поэтому вам нужно обернуть ее. Ваш Dockerfile может выглядеть так

FROM ghost:3
RUN npm install ghost-storage-adapter-s3
COPY entrypoint-wrapper.sh /usr/local/bin
ENTRYPOINT ["entrypoint-wrapper.sh"]

и скрипт

#!/bin/sh
mkdir -p ./content/adapters/storage
cp -r ./node_modules/ghost-storage-adapter-s3/ ./content/adapters/storage/s3
exec docker-entrypoint.sh "$@"

Обратите внимание, как эти две строки, влияющие на contentили нет. Во время Dockerfile вы получаете новый анонимный том для каждой строки запуска, поэтому изменения в этом дереве каталогов фактически не сохраняются в образе.)

https://stackoverflow.com/questions/59916656/no-such-file-or-directory-immediately-after-creating-it/59917818#comment105966104_59917818
Первый способ, по-видимому, не имеет смысла для производственного использования. Я не могу получить второй способ работы... когда я запускаю docker run -it --name ghost -e url=http://localhost:2368 -p 2368:2368 myimage:tagнет вывода из Docker, это как если бы он не запускал скрипт entrypoint. Вот мой РЕПО, если кто-нибудь может взглянуть github.com/markjackson02/ghost-blog-with-s3-adapter большое вам спасибо
https://stackoverflow.com/questions/59916656/no-such-file-or-directory-immediately-after-creating-it/59917818#comment105970388_59917818
Является entrypoint-wrapper.shоператоры echo, чтобы увидеть, работает ли он и как.
Закрыть X