系统概述
我正在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>
它正在完美地工作。
我试图解决什么问题?
我只是没有选择,因为该端口未被使用-对其进行更改,并且已经神奇地重新使用了该端口。 docker容器能够打开端口并使用它们:NGINX完美运行。我想,还有其他一些原因可以阻止打开nodeJS端口。
有什么提示吗?
答案 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
此外,您可以在容器环境中执行所需的命令。