微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Docker Compose本地目录未安装在远程部署中

如何解决Docker Compose本地目录未安装在远程部署中

我正在使用 docker-compose(在 Windows 上)来启动一个 mongoDB 以及几个 nodeJS 进程(通过 SSH 在远程 CentOS 机器上)。 nodeJS 容器应该将我项目目录中的代码安装到 /home/node/app 中,以便它们可以使用命令 node web/run 执行它。但是,当我使用 docker 上下文通过 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 中的工作原理?将我的代码放入容器以便执行的最佳做法是什么?

解决方法

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

编写一个 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 文件复制到远程系统(而不是覆盖文件),并在本地运行您构建和测试的确切映像,而无需单独复制应用程序代码。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。