首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >创建后立即“没有此类文件或目录”。

创建后立即“没有此类文件或目录”。
EN

Stack Overflow用户
提问于 2020-01-26 08:18:37
回答 2查看 4K关注 0票数 0

一些背景..。

我正试图为一个幽灵博客建立一个码头形象。我只是添加了一个模块:存储适配器,这样图像可以托管在S3上,而不是本地文件系统(默认设置)上。

存储适配器插件的自述文件中,安装说明是将模块复制到应用程序的工作目录中:

代码语言:javascript
运行
复制
npm install ghost-storage-adapter-s3
mkdir -p ./content/adapters/storage
cp -r ./node_modules/ghost-storage-adapter-s3 ./content/adapters/storage/s3

但是只有在容器的中才起作用。我希望在Docker构建中运行这些步骤,这样如果容器重新启动,就不会丢失这些更改。

问题

在我的Dockerfile中,我有:

代码语言:javascript
运行
复制
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

当我后退一步,尝试一次创建一个目录并验证它是否已经创建时,即

代码语言:javascript
运行
复制
RUN ls ./content
RUN mkdir ./content/adapters
RUN ls ./content/adapters

我知道这个错误:

代码语言:javascript
运行
复制
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

在我刚刚创建了目录之后,怎么可能会有“没有这样的目录”呢?

我尝试在创建文件夹mkdir -m 777 ./content/adapters时设置chmod权限,并将所有者更新为当前用户(root):RUN chown -R root ./content,但没有效果。

我至少可以通过更改./目录前缀来构建它,但这就将/content放在了应用程序根目录中,而这并不是它们所需要的。当我指定完整路径/var/lib/ghost/content/adapters/storage时,我会得到相同的错误。这似乎是一个许可的问题,但我不知道。

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2020-01-26 11:20:17

这是其安装目录的基本映像宣布一卷的典型症状。您不能创建在该目录、插件或其他目录中有任何附加内容的派生映像。

如果不尝试重复地执行此操作,则可以启动带有本地存储的映像副本,只运行一次安装,然后实际使用填充的数据目录。

代码语言:javascript
运行
复制
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可能看起来像

代码语言:javascript
运行
复制
FROM ghost:3
RUN npm install ghost-storage-adapter-s3
COPY entrypoint-wrapper.sh /usr/local/bin
ENTRYPOINT ["entrypoint-wrapper.sh"]

和包装脚本

代码语言:javascript
运行
复制
#!/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每次创建容器时都会在该目录上挂载卷,无论是否有docker run -v选项。在Dockerfile期间,您将为每个运行行获得一个新的匿名卷,这就是为什么对目录树的更改实际上不会在图像中持久存在。)

票数 2
EN

Stack Overflow用户

发布于 2020-01-26 08:59:26

如果它在您的容器中工作,您可以编写一个脚本bash作为入口点,为您处理这个问题。因此,每次重新启动容器时,都不会丢失更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59916656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档