Node.js 如何在没有Dockerfile的情况下设置Docker Compose?

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或对默认图像进行任

在过去的几个小时里,我一直在尝试设置nodejs 14和ReflectionDB 2.3.5的两个默认图像,如果语气有点沮丧,我很抱歉,但我现在很沮丧

我的要求似乎非常简单

我想:
  • 下载nodejs 14和DB 2.3.5的默认图像
  • 将我当前目录中的所有内容复制到nodejs 14映像中
  • 我希望nodejs映像依赖于db映像
  • 在nodejs 14图像中运行2个命令<代码>npm ci和
    npm测试
  • 请参阅测试中的标准输出
  • 我不需要:
  • 主机可以访问的任何端口
  • 自定义任何Dockerfile或对默认图像进行任何更改
  • 从主机文件系统到容器的任何更新
  • 将任何数据从主机复制到数据库容器
  • 为什么? 我希望测试能够在所有开发人员机器上重复-目前没有CI。无论开发人员的硬盘上有项目在哪里

    我有一个
    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       | }