docker-compose npm install && npm start 在入口点

Joh*_*ika 4 node.js npm docker docker-compose

我想使用 docker-compose 启动 2 个容器。一种用于数据库,另一种用于使用nodeDockerHub 上默认映像的节点服务器。在节点容器中,我想安装一个作为卷进行源代码控制的本地文件夹。我见过很多示例,其中创建了一个 Dockerfile,将源文件复制到映像中,然后RUN npm install在 Dockerfile 中使用命令。但这会导致创建一个包含源文件的新映像。就我而言,我不想将源代码文件保存在节点映像中。所以我希望entrypointdocker-compose 文件中的 Node 容器能够npm install像 一样运行npm start,但我似乎无法让该组合正常工作。这是我的docker-compose.yml

version: "3.8"

services:

  server:
    container_name: my_server
    image: node:12.16.1
    ports:
      - "8000:8000"
    volumes:
      - ../my-server-files-source-controlled:/var/www
    working_dir: /var/www
    entrypoint: ["npm", "start"]
    networks:
      - my-network

  db:
    container_name: my_database
    image: postgres
    environment:
      {ommitted}
    ports:
      - "5432:5432"
    networks:
      - my-network

networks:
  my-network:
    driver: bridge
Run Code Online (Sandbox Code Playgroud)

上面的命令工作正常,但是当我将 更改entrypoint为 include时npm install,它​​失败了。我尝试过以下示例以及许多其他示例,但它们都失败了:

entrypoint: ["npm", "install", "&&", "npm", "start"]
entrypoint: ["npm install", "npm start"]
entrypoint: "npm install && npm start"
Run Code Online (Sandbox Code Playgroud)

看来我可以拥有npm installnpm startin entrypoint,但不能两者兼而有之。如何让这两个命令在我的 docker-compose 文件中工作?

lxg*_*lxg 16

如果您想使用多个命令,可以使用以下命令bash -c "commands"

services:
    myservice:
        command: bash -c "npm install && npm start"
Run Code Online (Sandbox Code Playgroud)

顺便说一句,在生产部署中,我建议使用npm ci而不是npm install. 还可以考虑使用--only=prod--no-audit标志(取决于您的设置)。

  • `entrypoint:` 和 `command:` 连接在一起形成一个命令。这两部分都是可选的;通常,您可以通过 Dockerfile 中的“ENTRYPOINT”或“CMD”行指定它们,而不是在“docker-compose.yml”文件中覆盖它们。 (3认同)
  • 很有魅力,谢谢!那么,对于单个命令使用“入口点”,对于复杂的命令使用“命令”吗?我刚刚开始接触 docker,并且仍在尝试掌握所有选项。 (2认同)