不能复制本地目录到远程容器使用docker上下文



我一直在使用下面的Dokerfiledocker-compose.ylm在我的本地机器上工作,没有问题

Dokerfile

FROM node:14-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install 
COPY . .
EXPOSE 5000
CMD [ "npm", "start" ]

组成文件

...
app:
build:
context: .
dockerfile: Dockerfile
container_name: app 
restart: always 
image: nodeapp
ports:
- 5000:5000
volumes: 
- ./:/app
- /app/node_modules
networks:
- pnet 
...

当我使用docker context切换到远程主机

docker context create --docker "host=ssh://root@hostname" remotedocker context use remote然后运行docker compose up,我最终得到错误

npm犯错!代码ENOENTapi | npm ERR!系统调用打开api | npm ERR!路径/app/package.jsonpaylign_api | npm犯错!errno 2api | npm ERR!enent:没有这样的文件或目录,打开'/app/package.json'api | npm ERR!这与npm无法找到文件有关。api | npm ERR!enoentapi |api | npm ERR!这次运行的完整日志可以在下面找到:api | npm ERR!/root/.npm/_logs/2022-07-01T14_33_58_429Z-debug.log

我如何解决这个问题,以便部署到远程主机

volumes:总是由运行容器的Docker守护进程来解释。如果您使用上下文指向远程Docker守护进程,那么volumes:命名的卷和文件路径将由该远程守护进程解释,并指向远程主机上的文件。

docker build将本地构建上下文发送到远程Docker守护进程时,volumes:不能用于在主机之间复制文件。

这里最直接的解决方案是从Compose设置中删除volumes::

version: '3.8'
services:
app:
build: .
restart: always 
ports:
- 5000:5000
# volumes: will cause problems
# none of the other options should be necessary
# (delete every networks: block in the file)

然后当您docker-compose build映像时,构建器机制将把您的本地文件树发送到远程Docker守护进程。当你运行docker-compose up时,远程Docker将使用内置到镜像中的代码,而不是尝试用远程系统上的内容覆盖它。

同样的原则也适用于其他不一定涉及第二个主机的上下文中;例如,如果您使用主机的Docker守护进程从另一个容器中启动容器,则卷挂载在主机而不是容器文件系统中。一般来说,我建议不要尝试用volumes:挂载覆盖应用程序代码;运行实际内置于映像中的代码,并使用本地非docker工具进行实时开发。

最新更新