"Нет такого файла или каталога" сразу после его создания
Какая-то предыстория...
Я пытаюсь создать образ 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
, я получаю ту же ошибку. Кажется, это было бы хорошо, но я не знаю.
Любая помощь будет очень признательна.


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


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 вы получаете новый анонимный том для каждой строки запуска, поэтому изменения в этом дереве каталогов фактически не сохраняются в образе.)

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 большое вам спасибо

entrypoint-wrapper.sh
операторы echo, чтобы увидеть, работает ли он и как.