【问题标题】:Docker Compose local directory not mounted in remote deploymentDocker Compose 本地目录未安装在远程部署中
【发布时间】:2021-07-12 22:54:29
【问题描述】:

我正在使用 docker-compose(在 Windows 上)来启动一个 mongoDB 以及几个 nodeJS 进程(通过 SSH 在远程 CentOS 机器上)。 nodeJS 容器应该将我的项目目录中的代码挂载到/home/node/app,以便它们可以使用命令node web/run 执行它。但是,当我使用 docker context 通过 SSH 将这组容器部署到我的远程主机时,我收到一条错误消息,提示找不到 /home/node/app/web/run 处的脚本,这表明我的代码未复制/安装到容器中。

下面可以看到我正在挂载当前目录(我的项目):

  web:
    image: node:15.12.0
    user: node
    working_dir: /home/node/app
    volumes:
      - ./:/home/node/app:ro
    ports:
      - 80:80
    command: node web/run
    depends_on:
      - events-db

我是否误解了卷在 Docker 中的工作方式?将我的代码放入容器以便执行的最佳做法是什么?

【问题讨论】:

    标签: node.js docker docker-compose volumes


    【解决方案1】:

    将我的代码放入容器以便执行的最佳做法是什么?

    编写一个 Dockerfile 来构建一个包含它的镜像。 COPY 你的应用程序代码。如果你需要一个构建步骤(例如,将 Typescript 转换为纯 Javascript,或运行像 Webpack 这样的构建器)RUN Dockerfile 中的它。

    我是否误解了卷在 Docker 中的工作方式?

    当你有一个绑定挂载时,例如volumes: ['.:/home/node/app'],Docker 守护进程总是在它运行的系统上查找。卷和绑定挂载从不来自另一个系统,即使您是从其他地方启动容器。

    使用您显示的设置,您需要单独复制应用程序代码,并在那里运行它。在这种情况下使用 Docker 并没有真正的好处:您可以在两台主机上安装 Node,scp 您的应用程序代码和ssh other-host node web/run。

    另一方面,假设您确实将应用程序打包成图像。你可能有a pair of YAML files 喜欢:

    # docker-compose.yml
    version: '3.8'
    services:
      web:
        image: me/myapp
        ports:
          - 80:80
        depends_on:
          - events-db
        # USER, CMD, etc. taken from the Dockerfile
    
    # docker-compose.override.yml
    version: '3.8'
    services:
      web:
        build: .
    

    在您的本地系统上,您可以docker-compose up --build 容器,在本地运行和测试它。如果可行,您可以 docker-compose push 将构建的映像发送到 Docker Hub(或者,使用 image: registry.example.com/me/myapp 语法,云托管注册表或您自己运行的东西)。然后您可以只将docker-compose.yml 文件复制到远程系统(而不是覆盖文件),并在本地运行您构建和测试的确切映像,而无需单独复制应用程序代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      • 2021-08-23
      • 2015-08-18
      • 1970-01-01
      • 2011-04-21
      相关资源
      最近更新 更多