【问题标题】:Why is my official Ghost.org Docker container serving old content after I refresh my browser even though Ghost / Node are in development mode?为什么我的官方 Ghost.org Docker 容器在我刷新浏览器后仍然提供旧内容,即使 Ghost / Node 处于开发模式?
【发布时间】:2016-12-28 18:47:04
【问题描述】:

在为基于 docker / ghost.org 博客的站点设置完整的生产 CI 管道后,我正在尝试设置本地开发环境以更快地开发主题,但是 Ghost 在“开发模式”下运行并通过“ NODE_ENV = development" 更改在浏览器刷新时不可见。

我在本地运行官方的 Ghost Docker 容器 (https://hub.docker.com/_/ghost/),Ghost 在开发模式下正常运行,对本地主机代码(通过 -v 卷标签通过管道传输到 Docker 容器)所做的更改不可见在浏览器刷新时。

背景故事

由于我最初在 ghost 容器前运行 NGinx 反向代理,因此我首先尝试调整我的 nginx.conf 文件,因为我认为问题是基于缓存的。

我在我的 nginx.conf 中添加了以下内容,以尝试禁用本地 ghost.org 博客上的所有缓存,以确保我没有缓存我的页面:

expires off;

关于 Docker / NGinx 反向代理在与 virtualbox (Docker restart not showing the desired effect) 相关的 sendfile 方面存在一些问题,因此我将 sendfile 设置为关闭:

sendfile off;

当上述方法无效时,我完全删除了本地开发设置的反向代理(以尝试缩小可能的问题)。我以为这会解决问题并允许浏览器刷新以显示我的本地更改,但事实并非如此。

NGinx 反向代理被移除后

此时我只运行官方的 ghost docker 镜像(前面没有反向代理)。

显然问题出在 Ghost 上,所以我的第一反应是 Ghost 在“生产模式”下运行,尽管 Ghost 在启动结束时表示它在“开发模式”下运行。为了确保它在开发模式下运行,我从我的 config.js ghost 配置文件中删除了“生产”块选项(如果它确实处​​于生产模式,这将导致 ghost 出错)。

我还在配置文件的开头添加了一个 echo 语句,这样当 Ghost 启动时它会回显 NODE_ENV 的当前值(以确保正确设置为开发)。

删除容器:

docker rm ghost -f 

然后重新运行成功,ghost 回显“NODE_ENV = development”并启动,但再次看不到更改。

代码更改是否在容器内发生变化?

我的下一个想法是我的更改可能没有做任何事情/被传递到我的 docker 容器中。因此,我 docker exec -it'd 进入容器:

docker exec -it ghost bash

我在容器内安装了 vim,然后打开了其中一个 ghost 文件以验证源代码,然后退出 VIM 而不保存。然后我在本地主机上修改了文件并保存了它。

当我从 Ghost 容器中重新打开同一个文件时,我能够成功查看我的更改,因此证明我本地主机上基于卷的文件正确地找到了进入 Ghost 容器的方式,并且应该 em> 由于 Ghost 处于开发模式,因此可以通过浏览器刷新来提供/查看/更新。

尝试不同的容器?

接下来,我尝试了与 Docker Hub 不同的容器(即使更改这意味着我必须更改我的生产管道以同步所有内容)。

我搜索了 Docker hub,发现了两个最受欢迎的替代 Ghost.org docker 容器,然后将它们拉下来进行测试:

docker pull ptimof/ghost/ (2.9k pulls)

和

docker pull gold/ghost/ (1.9k pulls)]

显然,大多数人使用官方的 ghost docker 镜像,拉取次数超过 100 万次,所以我不相信这会产生任何影响,但是在查看 gold/ghost 和 ptimof/ghost 的 Dockerfile(s) 时都引用了修改以下行中的权限:

RUN chown -R user $GHOST_SOURCE/content

上面似乎引用了生产幽灵博客,然后修改了内容子目录的权限,该目录应该包含主题文件夹和我的代码更改。在这一点上我有点希望,但是,在用每个替代容器替换官方容器之后(即使 Dockerfile 看起来相同),问题仍然存在。

Ghost 的另一个版本?

我尝试的最后一件事是指定一个旧版本的 ghost,因为我认为这可能是最新发布的容器中的问题,我尝试了两个以前的版本,但没有任何影响。

StackOverflow 来帮忙?

由于我想不出其他可以尝试的方法,所以我想在继续我自己的搜索之前先在这里发布,希望有更多幽灵经验、更多 docker 经验(希望两者兼有)的人可能会偶然发现答案。

我使用的 docker run 命令是;

docker run --env NODE_ENV=development --name ghost -d -p 80:2368 -v ~/blog/ghost-letsencrypt/config/config dev.js:/usr/src/ghost/config.example.js -v ~/blog/ghost-letsencrypt/themes/:/usr/src/ghost/content/themes ghost:0.11.3

重申问题:一切正常,我的本地 ghost docker 容器按预期成功连接到我的远程 mysql 数据库。我的网站在浏览器中可见并正确显示,但是当我对本地代码进行更改时,容器重启或浏览器刷新都不会显示任何这些更改。

【问题讨论】:

  • 好的。因此,在写完整个问题、发布到 GitHub 以及可能两天的工作之后,错误结果出现在椅子和键盘之间。我在下面发布了一个完整的答案。

标签: node.js nginx docker ghost


【解决方案1】:

由于卷映射到 /src/(源)目录而不是 /var/lib/ghost 工作目录,因此在浏览器刷新时未正确显示对本地代码库的更改。

Ghost 文件结构

基本上,ghost 博客(在容器内或其他地方)有两个相同的文件结构,它们都可以包含主题/博客内容。源目录和工作目录。

第一个位于以下目录中:/usr/src/ghost/

此目录包含基本源 ghost 文件,如果在工作目录中没有找到其他主题/配置文件,则仅在博客启动期间使用/复制到工作目录。

默认配置位于:/usr/src/ghost/config.example.js

默认主题位于:/usr/src/ghost/content/themes

基本上 /src 源目录就像一个模板,存在于每个 ghost 安装中,仅用于备份/恢复目的。正是在这个目录中,我们复制/覆盖了默认配置文件,因为当 ghost 第一次启动时,它会将我们的 MODIFIED 默认配置拉入工作的 ghost 目录。

这是我(也许你)可能出错的地方,因为许多 docker 容器将它们的配置文件复制到 /src 目录中。

工作 Ghost 文件

第二个文件结构是 Ghost 在提供/创建静态或动态创建的页面时查找将实际与之交互的源文件的位置。工作目录位于 Ghost 容器中的以下位置:/var/lib/ghost

工作中的 ghost 服务器当前使用的主题位于:/var/lib/ghost/themes

因此,将工作目录的主题与源目录进行比较:/usr/src/ghost/content/themes /var/lib/ghost/themes

如您所见,/var/lib/ghost 路径中没有“content”子目录,而 src / 源文件结构中确实存在“content”子目录。

我们的问题是我们从 docker 卷中引用源目录/路径,而不是工作的 ghost 目录。因此,博客会正常启动(因为主题文件在 ghost 启动时确实存在,并且会从那里成功复制到我们工作的 ghost 目录中)但随后将无法修改,因为 Ghost 在启动时只查看源一次第一次。

这导致刷新浏览器或重新启动容器无效,因为 ghost 已经第一次启动了。 IE。 Ghost 仅在首次启动时从源 /src 文件结构复制一次,然后从那时起完全忘记/忽略该文件结构。

对源文件结构中的文件所做的任何更改都不会影响 Ghost 一旦运行,因此我们对卷引用的文件所做的更改不受 Ghost 监控,因此服务器不会显示/在浏览器。

【讨论】:

    猜你喜欢
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    相关资源
    最近更新 更多