Docker + EmberCLI + Windows =无法正常工作

时间:2019-03-27 08:01:56

标签: windows docker ember.js ember-cli docker-windows

系统概述

我正在Ember中开发应用程序,并且由于仍在开发中(版本2.15),因此无法将CLI更新到最新版本。但我想尝试将一些部件重构为余烬3.8。

因为我需要一个3.8余烬CLI,所以我尝试为其使用docker容器,以便可以不影响系统(v2.15)上的工作CLI。

我正在将Docker Desktop CE V2.0.0.3(31259)与Docker Engine 18.09.2。程序包是:“ danlynn / ember-cli:3.8.1”。我正在使用权限提升的PowerShell执行所有操作。 (Linux容器在Hyper-V的Moby映像中运行)

在这些测试/问题解决过程中,我的系统上没有其他容器在运行:

PS C:\docker_ember> docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
PS C:\docker_ember>

什么在起作用?

当我运行带有bash的容器以能够使用ember CLI时,一切正常-甚至是“ npm i”和“ ember build”:

PS C:\docker_ember> docker run --rm -ti -v ${PWD}:/myapp -p 4200:4200 -p 7020:7020 -p 7357:7357 danlynn/ember-cli:3.8.1 bash


root@a39fe0269e04:/myapp# npm i
npm WARN rollback Rolling back npm-bundled@1.0.5 failed (this is probably harmless): ENOTEMPTY: directory not empty, rmdir '/myapp/node_modules/fsevents/node_modules/npm-bundled'
npm WARN rollback Rolling back os-homedir@1.0.2 failed (this is probably harmless): ENOTEMPTY: directory not empty, rmdir '/myapp/node_modules/fsevents/node_modules/os-homedir'
...
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.7 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.7: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

audited 64805 packages in 61.406s
found 1 low severity vulnerability
  run `npm audit fix` to fix them, or `npm audit` for details


root@a39fe0269e04:/myapp# ember build
Environment: development

ember38/templates/index.hbs
  2:4  error  Incorrect indentation for `<div>` beginning at L2:C4. Expected `<div>` to be at an indentation of 2 but was found at 4.  block-indentation
  3:8  error  Incorrect indentation for `{{target.id}}` beginning at L3:C8. Expected `{{target.id}}` to be at an indentation of 6 but was found at 8.  block-indentation

===== 1 Template Linting Error

cleaning up...
Built project successfully. Stored in "dist/".


root@a39fe0269e04:/myapp#

什么不起作用?

但是问题是,我无法找到原因:“ ember服务器” /“ ember s”将无法工作。经过一些启动时间后,控制台会说:

Port 4200 is already in use.

但是不是。我已经检查了Windows和容器中的每个端口-它是免费的。我什至在不离开容器的情况下将.ember-cli配置文件中的端口更改为其他端口(我尝试> 10)-所有这些都在“使用中”。

我尝试了docker命令的其他变体-甚至没有任何端口暴露的变体:

docker run --rm -ti -v ${PWD}:/myapp -p 4200:4200 -p 7020:7020 -p 7357:7357 danlynn/ember-cli:3.8.1 bash

docker run --rm -ti -v ${PWD}:/myapp -p 4200:4200 -p 7020:7020 -p 7357:7357 --add-host=localhost:172.18.80.177 danlynn/ember-cli:3.8.1 bash

docker run --rm -ti -v ${PWD}:/myapp --network="host" danlynn/ember-cli:3.8.1 bash

docker run --rm -ti -v ${PWD}:/myapp --net=host --pid=host --privileged danlynn/ember-cli:3.8.1 bash

docker run --rm -ti -v ${PWD}:/myapp -p 4200 -p 7020 -p 7357 danlynn/ember-cli:3.8.1 bash

# This one replaces the bash with a real ember CLI command.
docker run --rm -ti -v ${PWD}:/myapp -p 4200:4200 -p 7020:7020 -p 7357:7357 danlynn/ember-cli:3.8.1 ember s

所以我尝试了其他一些打开端口的容器-NGINX:

PS C:\docker_ember> docker run --rm -ti -p 80:80 nginx
Unable to find image 'nginx:latest' locally
latest: Pulling from library/nginx
27833a3ba0a5: Pull complete
e83729dd399a: Pull complete
ebc6a67df66d: Pull complete
Digest: sha256:dff6326b09c76bef1425ee64c2e218b38737cdb5412b8ccf84ca70740bfa1db2
Status: Downloaded newer image for nginx:latest
172.17.0.1 - - [27/Mar/2019:07:46:05 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" "-"
2019/03/27 07:46:06 [error] 8#8: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "localhost", referrer: "http://localhost/"
172.17.0.1 - - [27/Mar/2019:07:46:06 +0000] "GET /favicon.ico HTTP/1.1" 404 556 "http://localhost/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36" "-"
^C

PS C:\docker_ember>

它正在完美地工作。

我试图解决什么问题?

  1. 我将docker桌面重置为出厂默认值。 (这甚至会删除 每张图片)
  2. 我卸载了整个Windows软件docker(甚至删除了moby映像),然后重新安装了它,并从docker hub上新鲜下载了。
  3. 在重新安装docker桌面CE软件之前,我删除了每个hyper-v网络适配器。
  4. 我尝试使用“纯”节点8 docker容器,并在其中手动安装了ember-cli@3.8.1-但结果相同。
  5. 我多次重启Windows。
  6. 我使用“ netcfg -d”重置了整个Windows网络。 (甚至删除了所有已保存的wifi密钥等)

我只是没有选择,因为该端口未被使用-对其进行更改,并且已经神奇地重新使用了该端口。 docker容器能够打开端口并使用它们:NGINX完美运行。我想,还有其他一些原因可以阻止打开nodeJS端口。

有什么提示吗?

2 个答案:

答案 0 :(得分:2)

您在用例中的假设是错误的。您无需在项目中全局安装相同的Ember CLI版本。实际上,它始终使用项目中安装的package.json定义的Ember CLI。如果在ember项目外部执行,则仅使用全局安装的Ember CLI。这主要用于创建新应用程序(ember new)或插件(ember addon)。您可以通过在余烬项目内和全局范围内打印出使用过的Ember CLI(ember -v)版本来轻松地自己验证该功能。

答案 1 :(得分:0)

该docker镜像已经直接运行ember服务器,因此您可能尝试两次运行ember服务器。如果检查dockerfile https://github.com/danlynn/ember-cli/blob/3.8.1/Dockerfile#L11,则该行指定如果您运行不带任何参数的映像将运行ember服务器。

如果在启动图像后使用其名称运行图像,则可以将其附加到容器:

$ docker run --name myapp --rm -ti -v $(pwd):/myapp -p 4200:4200 -p 7020:7020 -p 7357:7357 danlynn/ember-cli:3.8.1

附加到运行ember服务器的容器:

$ docker exec -it myapp bash

此外,您可以在容器环境中执行所需的命令。