Node.js 如何在没有Dockerfile的情况下设置Docker Compose?
在过去的几个小时里,我一直在尝试设置nodejs 14和ReflectionDB 2.3.5的两个默认图像,如果语气有点沮丧,我很抱歉,但我现在很沮丧 我的要求似乎非常简单 我想:Node.js 如何在没有Dockerfile的情况下设置Docker Compose?,node.js,docker-compose,rethinkdb,Node.js,Docker Compose,Rethinkdb,在过去的几个小时里,我一直在尝试设置nodejs 14和ReflectionDB 2.3.5的两个默认图像,如果语气有点沮丧,我很抱歉,但我现在很沮丧 我的要求似乎非常简单 我想: 下载nodejs 14和DB 2.3.5的默认图像 将我当前目录中的所有内容复制到nodejs 14映像中 我希望nodejs映像依赖于db映像 在nodejs 14图像中运行2个命令npm ci和npm测试 请参阅测试中的标准输出 我不需要: 主机可以访问的任何端口 自定义任何Dockerfile或对默认图像进行任
npm测试
docker compose.yml
文件
版本:“3”
服务:
测验:
图像:节点:14
端口:
- "3000:3000"
#命令:
#-npm ci
#-npm测试
卷数:
-“:/cli应用程序”
取决于:
-重新思考数据库
数据库:
图片:REJECTDB
端口:
- "28015:28015"
- "8080:8080"
卷数:
-“/数据:/data”
命令:referencedb--bindall--data/data
这个答案的要点是而不是给出必须尽可能简洁的解释(简短而清晰地表达),而是强调docs.docker.com和hub.docker.com上当前文档造成的所有混乱。最终我/我们会把它做好,并写出一个简洁的答案
已更正的docker compose.yml
:
版本:“3”
服务:
测验:
图:“节点:14”
用户:“节点”
工作目录:/home/node/app
卷数:
-./:/home/node/app
容器名称:nodejs
取决于:
-重新思考数据库
命令:bash-c“npmci&&npmtest”
数据库:
图:DB:2.3.5
容器名称:REJECTDB
令人沮丧的部分!
一开始,docs.docker.com和hub.docker.com上的文档可以说是有史以来最糟糕的文档,因为它是a)错误的,b)假定事先知道
如果以下任何一项是错误的,那就归咎于糟糕的文档
不,除非您计划建立自己的形象,否则您不需要Dockerfile。
因此,在浪费了一个小时左右的时间之后,您可能会幸运地发现,您使用context
试图绕过绝对路径示例的一切根本不重要除非您从头开始创建自己的图像(90%的docker用户不需要)
提示使用docker system prune
删除您通过以下示例创建的所有无用的docker容器
接下来,找到正确的docker容器
展示:docker官方形象!
你看到我们需要的图像名称了吗?
没有一个地方写着图像
。你只需要知道。
对docker compose.yml的逐行解释
版本:“3”
使用语法的3.x版本。语法因Docker引擎版本而异,如中所列
服务:
每个容器映像都是Docker Compose术语中的一个服务<代码>测试和db
是我的两张图片的名字。您可以根据需要命名它们,但稍后我们将使用此名称在两个图像之间创建依赖关系(一个图像需要先联机,然后再联机)
服务:
测验:
...
数据库:
...
测试
和重新思考数据库
是我们将让Docker Compose为我们运行的两项服务
修正:1。下载nodejs 14和DB 2.3.5的默认图像
图像:“节点:14”
幸运的是,nodejs Docker开发人员提供了非常好的文档,而不是适当的标准文档
映像变体:事实映像和节点:-alpine
映像基于流行的alpine Linux项目,该项目比大多数发行版基础映像(约5MB)小得多,因此通常会产生更细的映像
image:db:2.3.5
不幸的是,资金较少的RejectDB项目没有这样的信息。实际上,如果你一直向下滚动到页面底部,你会发现图像变体(很抱歉,我无法链接到hub.docker.com上的标题,因为它们没有id
或name
属性)。您要使用的两个版本是referencedb:
或referencedb:-slim
问:
那么,更主要的支持的标签和相应的Dockerfile链接如何呢
A:
它们的使用频率较低,是专门的docker图像。在RejectionDB案例中,它是安装在Debian Buster和CentOS上的RejectionDB数据库。还有一些版本的链接,但不是全部。所以这是一个选定的图像列表,你可能不想要。记住你必须点击标签或小的灰色链接;查看可用的标签(请参见上面带有红色方块的图像-抱歉,也没有锚链接支持)
修正:2。将我当前目录中的所有内容复制到nodejs 14映像中。
用户:“节点”
工作目录:/home/node/app
卷数:
-./:/home/node/app
如果您在上查找user
或working_dir
,则您在事先不了解docker
的情况下运气不佳。它只说:
每一个都是一个值,
CONTAINER ID IMAGE PORTS NAMES
5272576f8555 node:14 nodejs
fb11d5ce049b rethinkdb:2.3.5 8080/tcp, 28015/tcp, 29015/tcp rethinkdb
CONTAINER ID IMAGE PORTS NAMES
528e5ee37956 node:14 data_access_layer_tests_1
e80682b806fc rethinkdb:2.3.5 8080/tcp, 28015/tcp, 29015/tcp data_access_layer_rethinkdb_1
nodejs | internal/modules/cjs/loader.js:883
nodejs | throw err;
nodejs | ^
nodejs |
nodejs | Error: Cannot find module '/home/node/app/npm ci'
nodejs | at Function.Module._resolveFilename (internal/modules/cjs/loader.js:880:15)
nodejs | at Function.Module._load (internal/modules/cjs/loader.js:725:27)
nodejs | at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:72:12)
nodejs | at internal/main/run_main_module.js:17:47 {
nodejs | code: 'MODULE_NOT_FOUND',
nodejs | requireStack: []
nodejs | }