一些背景..。
我正试图为一个幽灵博客建立一个码头形象。我只是添加了一个模块:存储适配器,这样图像可以托管在S3上,而不是本地文件系统(默认设置)上。
在存储适配器插件的自述文件中,安装说明是将模块复制到应用程序的工作目录中:
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中,我有:
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
在我刚刚创建了目录之后,怎么可能会有“没有这样的目录”呢?
我尝试在创建文件夹mkdir -m 777 ./content/adapters
时设置chmod权限,并将所有者更新为当前用户(root):RUN chown -R root ./content
,但没有效果。
我至少可以通过更改./
目录前缀来构建它,但这就将/content放在了应用程序根目录中,而这并不是它们所需要的。当我指定完整路径/var/lib/ghost/content/adapters/storage
时,我会得到相同的错误。这似乎是一个许可的问题,但我不知道。
任何帮助都将不胜感激。
发布于 2020-01-26 11: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每次创建容器时都会在该目录上挂载卷,无论是否有docker run -v
选项。在Dockerfile期间,您将为每个运行行获得一个新的匿名卷,这就是为什么对目录树的更改实际上不会在图像中持久存在。)
发布于 2020-01-26 08:59:26
如果它在您的容器中工作,您可以编写一个脚本bash作为入口点,为您处理这个问题。因此,每次重新启动容器时,都不会丢失更改。
https://stackoverflow.com/questions/59916656
复制相似问题