系统总览
我正在使用Ember开发应用程序,由于较旧的应用程序仍处于开发阶段(版本2.15),因此无法将CLI更新到最新版本。但我想尝试重构一些部分来实现3.8。
因为我需要一个3.8 ember CLI,所以我尝试使用一个docker容器,这样我就可以保持我系统上的工作CLI(v2.15)不受影响。
我使用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 [email protected] failed (this is probably harmless): ENOTEMPTY: directory not empty, rmdir '/myapp/node_modules/fsevents/node_modules/npm-bundled'
npm WARN rollback Rolling back [email protected] failed (this is probably harmless): ENOTEMPTY: directory not empty, rmdir '/myapp/node_modules/fsevents/node_modules/os-homedir'
...
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: [email protected] (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for [email protected]: 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 server”/“ember s”将无效。在一些开始时间之后,控制台就是sais:
Port 4200 is already in use.
但事实并非如此。我检查了窗口和容器中的每个端口 - 它是免费的。我甚至将.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>
它只是完美无瑕地工作。
我有什么办法解决这个问题?
我只是没有选择,因为端口没有使用 - 改变它,它已经神奇地使用了AGAIN。 docker容器能够打开端口并使用它们:NGINX可以完美地工作。我想,还有一些其他原因阻止了nodeJS端口被打开。
有小费吗?
您的用例中有一个错误的假设。您不需要在项目中使用全局安装的Ember CLI版本。实际上它始终使用安装在项目中的Ember CLI,并由它的package.json
定义。如果在ember项目之外执行,它仅使用全局安装的Ember CLI。这主要用于创建新应用程序(ember new
)或插件(ember addon
)。您可以通过在ember项目中全局打印出使用过的Ember CLI(ember -v
)版本来轻松验证该功能。
该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
在内部,您可以在容器环境中执行所需的命令。