为什么我的官方 Ghost.org Docker 容器在我刷新浏览器后提供旧内容,即使 Ghost / Node 处于开发模式?
Why is my official Ghost.org Docker container serving old content after I refresh my browser even though Ghost / Node are in development mode?
为 docker / ghost.org 基于博客的站点设置完整的生产 CI 管道后,我尝试设置本地开发环境以更快地开发主题,但是在 "Development Mode" 中使用 Ghost 运行ning 并通过 "NODE_ENV = development" 更改在浏览器刷新时不可见。
我在本地 运行安装官方 Ghost Docker 容器 (https://hub.docker.com/_/ghost/),Ghost 正确地处于开发模式,对本地主机代码所做的更改(通过管道传输到Docker 容器(通过 -v volumes 标签)在浏览器刷新时不可见。
背景故事
由于我最初 运行 在 ghost 容器前面设置了一个 NGinx 反向代理,所以我开始尝试调整我的 nginx.conf 文件,因为我认为问题是基于缓存的。
我将以下内容添加到我的 nginx.conf 以尝试禁用本地 ghost.org 博客上的所有缓存以确保我没有缓存我的页面:
expires off;
我关于 Docker / NGinx 反向代理在与 virtualbox () 相关的 sendfile 方面有一些问题,所以我关闭了 sendfile:
sendfile off;
当上述没有效果时,我完全删除了本地开发设置的反向代理(以尝试缩小可能的问题范围)。我认为这会解决问题并允许浏览器刷新以显示我的本地更改,但事实并非如此。
删除 NGinx 反向代理后
此时我 运行 只使用官方 ghost docker 图像(前面没有反向代理)。
显然问题出在 ghost 上,所以我的第一反应是 Ghost 在 "Production Mode" 中 运行ning,尽管 Ghost 说它在 "development mode" 中 运行ning它的启动结束。为了确保它在开发模式下 运行ning 我从我的 config.js ghost 配置文件中删除了 "Production" 块选项(如果它确实处于生产模式,这将导致 ghost 出错) .
我还在配置文件的开头添加了一个 echo 语句,这样当 Ghost 启动时它会回显 NODE_ENV 的当前值(以确保它已正确设置为开发)。
删除容器:
docker rm ghost -f
然后重新运行 成功,ghost 回显 "NODE_ENV = development" 并启动,但再次看不到更改。
代码更改是否在容器内部更改?
我的下一个想法是我的更改可能不会执行任何操作/被传递到我的 docker 容器中。因此我 docker exec -it'd into the container with:
docker exec -it ghost bash
我在容器内安装了vim,然后在退出VIM之前打开其中一个ghost文件来验证源,而不保存。然后我在我的本地主机上修改了文件并保存了它。
当我从 Ghost 容器中重新打开同一个文件时,我能够成功地查看我的更改,从而证明我本地主机上基于卷的文件正确地找到了进入 Ghost 容器的路径并且 应该 能够通过浏览器刷新来提供/查看/更新,因为 Ghost 处于开发模式。
试试不同的容器?
接下来,我尝试了来自 Docker Hub 的不同容器(尽管更改此容器意味着我必须更改我的生产管道以同步备份所有内容)。
我搜索了 Docker 集线器并找到了两个最受欢迎的替代 Ghost.org docker 容器,然后将它们拉下来进行测试:
docker拉ptimof/ghost/(2.9k拉)
和
docker拉gold/ghost/(1.9k拉)]
显然,大多数人都使用官方幽灵 docker 图像进行了 100 万次以上的拉动,所以我不确定这会产生任何影响,但是在查看 Docker 文件时gold/ghost 和 ptimof/ghost 都在以下行中引用了对权限的修改:
RUN chown -R user $GHOST_SOURCE/content
上面似乎引用了生产幽灵博客,然后修改了内容子目录的权限,该目录应该包含主题文件夹和我的代码更改。在这一点上我有点希望,但遗憾的是,在用每个替代容器替换官方容器后(即使 Docker 文件看起来相同)问题仍然存在。
另一个版本的 Ghost?
我尝试的最后一件事是指定一个旧版本的 ghost,因为我认为它可能是最新发布的容器中的一个问题,我尝试了两个以前的版本,但这没有影响。
Whosebug 来拯救?
因为我想不出还有什么可以尝试的,所以我想我会 post 在这里继续我自己的搜索,希望有更多幽灵经验的人,更多 docker 经验(希望两者都有)可能会偶然发现答案。
我使用的docker 运行命令是;
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 数据库。我的站点在浏览器中可见并正确显示,但是当我更改本地代码时,容器重启或浏览器刷新都不会显示任何这些更改。
对本地代码库的更改在浏览器刷新时未正确显示,因为卷映射到 /src/(源)目录而不是 /var/lib/ghost 工作目录。
幽灵文件结构
基本上,幽灵博客(在容器内或其他地方)有两个相同的文件结构,都可以包含主题/博客内容。源目录和工作目录。
第一个位于以下目录中:/usr/src/ghost/
如果在工作目录中找不到其他主题/配置文件,此目录包含仅在博客启动期间使用/复制到工作目录的基本源 ghost 文件。
默认配置位于:/usr/src/ghost/config.example.js
默认主题位于:/usr/src/ghost/content/themes
本质上,/src 源目录就像一个模板,存在于每个 ghost 安装中,仅用于备份/还原目的。正是在这个目录中,我们复制/覆盖了默认配置文件,因为当 ghost 第一次启动时,它会将我们修改后的默认配置拉到工作 ghost 目录中。
这是我(也许还有你)可能出错的地方,因为许多 docker 容器将它们的配置文件复制到 /src 目录中。
工作幽灵文件
第二个文件结构是 Ghost 寻找源文件的地方,在提供/创建静态或动态创建的页面时,它会实际与之交互。工作目录位于 Ghost 容器中的以下位置:/var/lib/ghost
正在运行的 ghost 服务器当前正在使用的主题位于:/var/lib/ghost/themes
因此,比较工作目录和源目录的主题:/usr/src/ghost/content/themes
/var/lib/ghost/主题
如您所见,/var/lib/ghost 路径中没有 "content" 子目录,而 "content" 子目录确实存在于 src / 源文件结构中。
我们的问题是我们引用了 docker 卷中的源目录/路径,而不是工作的 ghost 目录。因此博客会正常启动(因为主题文件 DID 在 ghost 启动时存在,并且会成功地从那里复制到我们的工作 ghost 目录中)但随后将无法修改,因为 Ghost 在启动时只查看一次源第一次。
这导致刷新浏览器或重新启动容器无效,因为 ghost 已经是第一次启动了。 IE。 Ghost 仅在首次启动时从源 /src 文件结构复制一次,然后从那时起完全忘记/忽略该文件结构。
在源文件结构中对文件的任何更改都不会影响 Ghost 一旦 运行 因此我们对卷引用的文件所做的更改不会被 ghost 监控,因此不会被显示服务器/在浏览器中可见。
为 docker / ghost.org 基于博客的站点设置完整的生产 CI 管道后,我尝试设置本地开发环境以更快地开发主题,但是在 "Development Mode" 中使用 Ghost 运行ning 并通过 "NODE_ENV = development" 更改在浏览器刷新时不可见。
我在本地 运行安装官方 Ghost Docker 容器 (https://hub.docker.com/_/ghost/),Ghost 正确地处于开发模式,对本地主机代码所做的更改(通过管道传输到Docker 容器(通过 -v volumes 标签)在浏览器刷新时不可见。
背景故事
由于我最初 运行 在 ghost 容器前面设置了一个 NGinx 反向代理,所以我开始尝试调整我的 nginx.conf 文件,因为我认为问题是基于缓存的。
我将以下内容添加到我的 nginx.conf 以尝试禁用本地 ghost.org 博客上的所有缓存以确保我没有缓存我的页面:
expires off;
我关于 Docker / NGinx 反向代理在与 virtualbox (
sendfile off;
当上述没有效果时,我完全删除了本地开发设置的反向代理(以尝试缩小可能的问题范围)。我认为这会解决问题并允许浏览器刷新以显示我的本地更改,但事实并非如此。
删除 NGinx 反向代理后
此时我 运行 只使用官方 ghost docker 图像(前面没有反向代理)。
显然问题出在 ghost 上,所以我的第一反应是 Ghost 在 "Production Mode" 中 运行ning,尽管 Ghost 说它在 "development mode" 中 运行ning它的启动结束。为了确保它在开发模式下 运行ning 我从我的 config.js ghost 配置文件中删除了 "Production" 块选项(如果它确实处于生产模式,这将导致 ghost 出错) .
我还在配置文件的开头添加了一个 echo 语句,这样当 Ghost 启动时它会回显 NODE_ENV 的当前值(以确保它已正确设置为开发)。
删除容器:
docker rm ghost -f
然后重新运行 成功,ghost 回显 "NODE_ENV = development" 并启动,但再次看不到更改。
代码更改是否在容器内部更改?
我的下一个想法是我的更改可能不会执行任何操作/被传递到我的 docker 容器中。因此我 docker exec -it'd into the container with:
docker exec -it ghost bash
我在容器内安装了vim,然后在退出VIM之前打开其中一个ghost文件来验证源,而不保存。然后我在我的本地主机上修改了文件并保存了它。
当我从 Ghost 容器中重新打开同一个文件时,我能够成功地查看我的更改,从而证明我本地主机上基于卷的文件正确地找到了进入 Ghost 容器的路径并且 应该 能够通过浏览器刷新来提供/查看/更新,因为 Ghost 处于开发模式。
试试不同的容器?
接下来,我尝试了来自 Docker Hub 的不同容器(尽管更改此容器意味着我必须更改我的生产管道以同步备份所有内容)。
我搜索了 Docker 集线器并找到了两个最受欢迎的替代 Ghost.org docker 容器,然后将它们拉下来进行测试:
docker拉ptimof/ghost/(2.9k拉)
和
docker拉gold/ghost/(1.9k拉)]
显然,大多数人都使用官方幽灵 docker 图像进行了 100 万次以上的拉动,所以我不确定这会产生任何影响,但是在查看 Docker 文件时gold/ghost 和 ptimof/ghost 都在以下行中引用了对权限的修改:
RUN chown -R user $GHOST_SOURCE/content
上面似乎引用了生产幽灵博客,然后修改了内容子目录的权限,该目录应该包含主题文件夹和我的代码更改。在这一点上我有点希望,但遗憾的是,在用每个替代容器替换官方容器后(即使 Docker 文件看起来相同)问题仍然存在。
另一个版本的 Ghost?
我尝试的最后一件事是指定一个旧版本的 ghost,因为我认为它可能是最新发布的容器中的一个问题,我尝试了两个以前的版本,但这没有影响。
Whosebug 来拯救?
因为我想不出还有什么可以尝试的,所以我想我会 post 在这里继续我自己的搜索,希望有更多幽灵经验的人,更多 docker 经验(希望两者都有)可能会偶然发现答案。
我使用的docker 运行命令是;
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 数据库。我的站点在浏览器中可见并正确显示,但是当我更改本地代码时,容器重启或浏览器刷新都不会显示任何这些更改。
对本地代码库的更改在浏览器刷新时未正确显示,因为卷映射到 /src/(源)目录而不是 /var/lib/ghost 工作目录。
幽灵文件结构
基本上,幽灵博客(在容器内或其他地方)有两个相同的文件结构,都可以包含主题/博客内容。源目录和工作目录。
第一个位于以下目录中:/usr/src/ghost/
如果在工作目录中找不到其他主题/配置文件,此目录包含仅在博客启动期间使用/复制到工作目录的基本源 ghost 文件。
默认配置位于:/usr/src/ghost/config.example.js
默认主题位于:/usr/src/ghost/content/themes
本质上,/src 源目录就像一个模板,存在于每个 ghost 安装中,仅用于备份/还原目的。正是在这个目录中,我们复制/覆盖了默认配置文件,因为当 ghost 第一次启动时,它会将我们修改后的默认配置拉到工作 ghost 目录中。
这是我(也许还有你)可能出错的地方,因为许多 docker 容器将它们的配置文件复制到 /src 目录中。
工作幽灵文件
第二个文件结构是 Ghost 寻找源文件的地方,在提供/创建静态或动态创建的页面时,它会实际与之交互。工作目录位于 Ghost 容器中的以下位置:/var/lib/ghost
正在运行的 ghost 服务器当前正在使用的主题位于:/var/lib/ghost/themes
因此,比较工作目录和源目录的主题:/usr/src/ghost/content/themes /var/lib/ghost/主题
如您所见,/var/lib/ghost 路径中没有 "content" 子目录,而 "content" 子目录确实存在于 src / 源文件结构中。
我们的问题是我们引用了 docker 卷中的源目录/路径,而不是工作的 ghost 目录。因此博客会正常启动(因为主题文件 DID 在 ghost 启动时存在,并且会成功地从那里复制到我们的工作 ghost 目录中)但随后将无法修改,因为 Ghost 在启动时只查看一次源第一次。
这导致刷新浏览器或重新启动容器无效,因为 ghost 已经是第一次启动了。 IE。 Ghost 仅在首次启动时从源 /src 文件结构复制一次,然后从那时起完全忘记/忽略该文件结构。
在源文件结构中对文件的任何更改都不会影响 Ghost 一旦 运行 因此我们对卷引用的文件所做的更改不会被 ghost 监控,因此不会被显示服务器/在浏览器中可见。