gpt4 book ai didi

Windows 上 Docker 中的 Node.js 开发环境

转载 作者:可可西里 更新时间:2023-11-01 09:19:51 26 4
gpt4 key购买 nike

我已经尝试了所有我能想到的。我已阅读文档、博客并尝试在 github 上关注示例。

但我似乎无法让它工作。

我想做的很简单。我想在我的 windows 8.1 机器上编写我的 node.js 代码,我还想从 Docker 容器中运行代码,而不必一直重建容器。所以我想将我的 Windows 主机上的目录映射到容器内的目录。

我已经创建了这个 Dockerfile

FROM node:0.10.38

RUN apt-get update -qq && apt-get install -y build-essential

ENV ZMQ_VERSION 4.1.3
ENV LIBSODIUM_VERSION 1.0.3

RUN curl -SLO "https://download.libsodium.org/libsodium/releases/libsodium-$LIBSODIUM_VERSION.tar.gz" \
&& tar xvf libsodium-$LIBSODIUM_VERSION.tar.gz \
&& cd libsodium-$LIBSODIUM_VERSION \
&& ./configure \
&& make \
&& make install \
&& cd .. \
&& rm -r libsodium-$LIBSODIUM_VERSION \
&& rm libsodium-$LIBSODIUM_VERSION.tar.gz
RUN curl -SLO "http://download.zeromq.org/zeromq-$ZMQ_VERSION.tar.gz" \
&& tar xvf zeromq-$ZMQ_VERSION.tar.gz \
&& cd zeromq-$ZMQ_VERSION \
&& ./configure \
&& make \
&& make install \
&& cd .. \
&& rm -r zeromq-$ZMQ_VERSION \
&& rm zeromq-$ZMQ_VERSION.tar.gz
RUN ldconfig

COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

RUN mkdir -p /usr/src/app
ADD . /usr/src/app
WORKDIR /usr/src/app
RUN npm install

EXPOSE 3000
EXPOSE 35729

CMD ["npm", "start"]

我有这个简单的 server.js 文件

var express = require('express');
var app = express();
var zmq = require('zmq');

app.get('/', function (req, res) {
res.send('ZMQ: ' + zmq.version);
});

var server = app.listen(3000, function () {
var host = server.address().address;
var port = server.address().port;

console.log('Example app listening at http://%s:%s', host, port);
});

还有这个简单的 package.json

{
"name": "docker-node-hello-world",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"start": "node server.js"
},
"author": "",
"license": "ISC",
"dependencies": {
"express": "^4.13.3",
"zmq": "^2.14.0"
}
}

我已经安装了最新的 Docker 工具箱,可以正常运行 Docker Hello World 示例。当我在我的 Dockerfile 所在的目录中时,我尝试像这样构建我的 docker 镜像。

docker build -t dockernodetest:dockerfile .

然后我尝试运行它,也是从 Docker 快速启动终端内的相同位置。我使用散列,因为标签由于某种原因不使用:

docker run -v//c/Bitbucket/docker-node-hello-world/:/usr/src/app -p 3000:3000 -i -t 9cfd34e046a5 ls ./usr/src/app

结果是一个空目录。我希望我可以调用

docker run -v//c/Bitbucket/docker-node-hello-world/:/usr/src/app -p 3000:3000 -i -t 9cfd34e046a5 npm start

但由于主机目录不可用,它失败了。我觉得我误解了一些非常基本的东西。我只是不知道是什么。

最佳答案

首先让我们从Dockerfile

开始
FROM node:0.10.38-onbuild

RUN apt-get update -qq && apt-get install -y build-essential

ENV ZMQ_VERSION 4.1.3
ENV LIBSODIUM_VERSION 1.0.3

RUN curl -SLO "https://download.libsodium.org/libsodium/releases/libsodium-$LIBSODIUM_VERSION.tar.gz" \
&& tar xvf libsodium-$LIBSODIUM_VERSION.tar.gz \
&& cd libsodium-$LIBSODIUM_VERSION \
&& ./configure \
&& make \
&& make install \
&& cd .. \
&& rm -r libsodium-$LIBSODIUM_VERSION \
&& rm libsodium-$LIBSODIUM_VERSION.tar.gz
RUN curl -SLO "http://download.zeromq.org/zeromq-$ZMQ_VERSION.tar.gz" \
&& tar xvf zeromq-$ZMQ_VERSION.tar.gz \
&& cd zeromq-$ZMQ_VERSION \
&& ./configure \
&& make \
&& make install \
&& cd .. \
&& rm -r zeromq-$ZMQ_VERSION \
&& rm zeromq-$ZMQ_VERSION.tar.gz
RUN ldconfig

EXPOSE 3000 35729

从第 1 行开始,我使用了 0.10.38-onbuild 标记,因为我想利用将运行的 onbuild scripts 来创建 /usr/src/app 目录并运行 npm install

然后server.jspackage.json就是你写的了。它们也与 Dockerfile 位于同一工作目录中。

接下来我们构建图像

docker build -t dockernodetest .

我省略了 dockerfile 标签,因为它似乎没有必要。无论如何,客户端都会自动添加一个 latest 标签。要查看您在本地有哪些图像,请运行 docker images

此时我们应该有一个准备运行的图像,但让我们首先检查我们想要加载的文件然后 npm install 创建了 node_modules 目录

$ docker run dockernodetest ls /usr/src/app
Dockerfile
node_modules
package.json
server.js

此时我们已准备好运行我们的小 nodejs 应用

$ docker run -it -p 8080:3000 dockernodetest

> docker-node-hello-world@1.0.0 start /usr/src/app
> node server.js

Example app listening at http://0.0.0.0:3000

在本例中,我使用了 -p 8080:3000 标志将容器的 3000 端口映射到主机上的 8080 端口。请注意,我最后没有任何其他命令,因为我提取的 -onbuild 图像有一个 CMD [ "npm", "start"] 和所以默认操作是运行 start 包脚本。

因此,为了加快开发周期,您需要通过 -v 选项将工作目录挂载到容器

$ docker run -it -p 8080:3000 -v "$PWD":/usr/src/app dockernodetest

> docker-node-hello-world@1.0.0 start /usr/src/app
> node server.js


module.js:340
throw err;
^
Error: Cannot find module 'express'
at Function.Module._resolveFilename (module.js:338:15)
at Function.Module._load (module.js:280:25)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at Object.<anonymous> (/usr/src/app/server.js:1:77)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)

npm ERR! Linux 4.1.7-15.23.amzn1.x86_64
npm ERR! argv "node" "/usr/local/bin/npm" "start"
npm ERR! node v0.10.38
npm ERR! npm v2.11.1
npm ERR! code ELIFECYCLE
npm ERR! docker-node-hello-world@1.0.0 start: `node server.js`
npm ERR! Exit status 8

但是这里发生了什么?因为我们挂载了当前工作目录,所以它覆盖了之前在 /usr/src/app 中的内容,包括我们的 node_modules 目录。

所以这里的快速修复是在我们当前的工作目录中运行 npm install 并重新运行 docker run 命令。

$ npm install
docker-node-hello-world@1.0.0 /home/ec2-user/dockernode
└─┬ express@4.13.3
├─┬ accepts@1.2.13
│ ├─┬ mime-types@2.1.7
...
$ docker run -it -p 8080:3000 -v "$PWD":/usr/src/app dockernodetest

> docker-node-hello-world@1.0.0 start /usr/src/app
> node server.js

Example app listening at http://0.0.0.0:3000

现在,如果您对 server.js 文件进行更新,只需按 Ctrl+c 并重启您的 docker 镜像,尽管您可能需要使用像 nodemon 这样的东西来使这更加无缝。

关于Windows 上 Docker 中的 Node.js 开发环境,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33861981/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com