docker-撰写上下文引用不相关的目录

docker-compose context references directories that are not related

我做了两个这样的文件:

# file: /home/john/work/docker/build.yml


version: "3.8"
services:
  website:
    build:
      context: ../
      dockerfile: ./docker/docker-files/build.dockerfile
    entrypoint: ["tail", "-f", "/dev/null"]
# file: /home/john/work/docker/docker-files/build.dockerfile
FROM mysql:latest

然后我运行执行以下命令:

cd /home/john/work/docker
docker-compose -f build.yml up --build -d

但这给出了错误

error checking context: 'no permission to read from '/home/john/work/db/docker-john/mongo/WiredTiger''.

我不明白为什么错误会提到/home/john/work/db/docker-john/mongo/WiredTiger?它甚至与我的 docker 项目无关,我也没有提及它!如果我删除目录 /home/john/work/db,那么我的 docker-compose -f build.yml up --build -d 就可以正常工作了。

这是怎么回事?为什么 docker-compose 引用的目录与我想要的无关?

docker-compose -f 选项提到的(第一个)Compose 文件在 /home/john/work/docker 中,因此所有 Compose 文件中的所有路径都被认为是相对于该目录的。

构建图像时,将其父级指定为构建上下文:

build:
  context: ../

相对于 Compose 文件的目录,这是 /home/john/work 目录。

Docker 向自己发送上下文目录中所有内容的副本,减去该目录 .dockerignore file 中的内容。如果其中的一个子目录不可读,那么您将遇到您描述的那种错误。

我猜你不是真的要将父目录复制到镜像中,你需要更改

build:
  context: .

Double-check Docker 文件中的文件路径:任何 COPY(和 ADD)指令的 left-hand 端总是相对于此 context: 目录(删除了前导 .. 和前导 /)。

考虑将 Docker 文件准确命名为 Dockerfile 并将其放在项目的 top-level 目录中以进一步简化。如果此构建片段仅在开发人员系统上使用但始终在那里使用,您还可以将文件命名为 docker-compose.override.ymlCompose will automatically use that

# docker-compose.override.yml
# (only for development, not for production)
version: '3.8'
services:
  website:
    build: .