如何解决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 举报,一经查实,本站将立刻删除。