【发布时间】: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