【发布时间】:2022-01-23 03:10:39
【问题描述】:
我正在尝试使用 Docker Compose 在本地开发一个项目,并且为了防止在每次更新时重新构建我的映像,我添加了一个 bind-mount,它将我的 src 目录映射到我在 Docker 中的 WORDIR。然后,在我的本地机器上所做的所有更改都会反映在我的 Docker 容器中……除了一个文件。出于某种原因,我的项目中有一个文件,当我更改其内容时,即使与此文件相邻的其他文件确实检测到文件更改,更改也不会反映在 Docker 容器中。这使我相信该目录已正确映射,但文件本身存在其他问题?
docker-compose.yaml
graphql:
build:
context: .
dockerfile: ./app/graphql/src/Dockerfile
target: development
volumes:
- ./app/graphql/src:/workspace
- /workspace/node_modules/
Dockerfile
# ------------> Base Image
FROM node:14 AS base
WORKDIR /workspace
COPY ./app/graphql/src .
# ------------> Development Image
FROM base AS development
CMD ["npm", "run", "dev"]
我还没有弄清楚如何显示目录结构,但我正在修改的文件位于:
/app/graphql/src/api/graphql
文件 a.ts 检测到更改并反映在 Docker 容器中,但 b.ts 没有。我读到了 Docker 如何依赖文件的 inode 来匹配是否绑定挂载特定文件。我正在安装一个目录,但为了进行完整性检查,我运行了:
ls -i
在主机和容器中,并确认 inode 匹配。
我有两台 M1 Mac 电脑,我确认这是两台机器之间的问题。
还有什么其他想法可以调试这个问题吗?我唯一的另一个想法是我达到了可以跟踪的最大文件数,但这就是我删除node_modules 的原因。任何帮助都会非常有帮助!
编辑:我创建了一个新文件 c.ts 并复制了 b.ts 的内容(主机和容器之间没有更改的文件)......并且 c.ts 正确检测到更改!有没有办法检查为什么某个文件没有广播更改?这太奇怪了。
【问题讨论】:
-
一些热重载工具不会重载文件,除非它在某处被使用。
b.ts是否被导入到某个地方? -
@NickODell 嘿!是的,我不确定您是否在底部看到了我的编辑,但是添加
c.ts并从b.ts复制代码(因此它执行相同)会导致c.ts的热重载。我必须运行docker compose down,删除b.ts并将b.ts重新添加到我的目录,然后运行docker compose up,现在它可以工作了。是否有特定的文件权限或影响主机更改容器中文件的东西?我仍然可以在我的另一台计算机上调试它 -
WRT 权限:如果您在权限字段中输入
ls -l b.ts,在与用户权限对应的前三个字符中,您是否有一个“r”,表示读取权限? -
我看到
-rw-r--r--我认为这是我们想要的,对吧?该目录中的所有其他文件具有相同的权限,并且通过热重载正确检测到
标签: docker docker-compose dockerfile