我想尝试使用 Docker 作为本地开发工具 \xe2\x80\x94 我曾经docker-compose启动 3 个容器:一个用于数据库(postgres)、前端(在监视模式下运行 webpack 和 Node sass)和后端(Elixir /凤凰)。
一切都很好,除了当我点击localhost:4000页面加载速度非常慢 \xe2\x80\x94 10-15 秒只是为了获取静态的登录页面。
我检查了日志docker-compose,服务器响应时间像平常一样快,这对我来说意味着某些东西正在减慢与容器的连接。
当我再次直接在终端中运行服务器时,一切都非常快,例如加载同一页面需要 1 秒。
\n\n我是 Docker 新手,所以我怀疑我可能缺少一些配置方面的东西。任何想法表示赞赏。谢谢你!
\n\n配置
\n\ndocker-compose.yml
\n\nversion: "3.6"\n\nservices:\n postgres:\n container_name: postgres\n image: postgres:11.0-alpine\n ports:\n - 5432:5432\n volumes:\n - postgres:/var/lib/postgresql/data\n\n front-end:\n container_name: front-end\n env_file:\n - "docker/dev/.env"\n build:\n context: "."\n dockerfile: "docker/dev/Dockerfile.front-end"\n volumes:\n - .:/app\n - node_modules:/app/node_modules\n - static:/app/priv/static\n command: npm run dev\n\n backend:\n container_name: backend\n build:\n context: "."\n dockerfile: …Run Code Online (Sandbox Code Playgroud) 我只是想chromedriver在 Alpine docker 容器中运行,但我不断收到此错误:
Starting ChromeDriver 72.0.3626.121 on port 9515
Only local connections are allowed.
Please protect ports used by ChromeDriver and related test frameworks to prevent access by malicious code.
[1560858426.290][SEVERE]: bind() returned an error, errno=0: Address not available (99)
[1560858426.290][INFO]: listen on IPv6 failed with error ERR_ADDRESS_INVALID
Run Code Online (Sandbox Code Playgroud)
Dockerfile 很简单
FROM alpine:3.9
RUN apk --no-cache --update add chromium chromium-chromedriver
EXPOSE 9515
CMD chromedriver --verbose
Run Code Online (Sandbox Code Playgroud)
我正在尝试将它与其他容器一起使用,因此docker-compose.yml这是有用的相关部分:
version: "3.6"
services:
chromedriver:
container_name: chromedriver
build:
context: "."
dockerfile: …Run Code Online (Sandbox Code Playgroud) 一旦我开始在 Phoenix 上使用 Channels,我就开始在 Heroku 上遇到很多这样的错误:
heroku[router]: at=error code=H15 desc="Idle connection" method=GET
path="/socket/websocket?guardian_token=eyJhbGciOiJIUz[...]&vsn=1.0.0" host=[...]
dyno=web.1 connect=0ms service=87803ms status=503 bytes=
Run Code Online (Sandbox Code Playgroud)
重现这一点的可靠方法是在笔记本电脑上:
我已经在我的 UserChannel 上设置了 45 秒的超时时间;我正在运行 Elixir 1.4.2,Phoenix1.2.1并且我phoenix.js刚刚升级到 Phoenix 中使用的那个1.3.0-rc0(链接到 rev)
我可以看到前端记录的错误,但之后它愉快地重新连接到后端:
2017-03-04 23:28:55.351 receive: ok user:2 phx_reply (3)
2017-03-04 23:29:24.269 channel: error user:2
2017-03-04 23:29:28.713 push: user:2 phx_join (4)
2017-03-04 23:29:28.745 receive: ok user:2 phx_reply (4)
Run Code Online (Sandbox Code Playgroud)
非常感谢任何帮助或想法如何解决这个问题。
编辑:我熟悉 Heroku …
我有一个DynamicSupervisor开始孩子的restart: :transient.默认情况下,如果子项异常退出,则主管将重新启动它.
但是,按照设计,如果孩子在3次重启后失败,主管本身将退出.来自文档:
https://hexdocs.pm/elixir/Supervisor.html#module-exit-reasons-and-restarts
Notice that supervisor that reached maximum restart intensity will exit
with :shutdown reason. In this case the supervisor will only be restarted
if its child specification was defined with the :restart option set to :permanent
(the default).
Run Code Online (Sandbox Code Playgroud)
由于杀死主管也会杀死其他孩子(正在进行的后台工作),我想避免这种情况.
问题是:到达后max_restarts,我怎样才能杀死失败的子进程,保留主管及其他孩子?
使用Elixir 1.6/OTP 20.
更新:我在StackOverflow上找到了这个答案,它基本上表明顶级DynamicSupervisor为每个孩子启动一个DynamicSupervisor; 顶级将用restart: :permanent或启动儿童监督员:temporary.这是一个很好的解决方法,但如果有另一个解决方案,我会感兴趣.