我一直在使用下面的Dokerfile
和docker-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" remote
和docker 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工具进行实时开发。