首页 > 解决方案 > 使用构建上下文和 Dockerfile 文件夹中的文件从任意文件夹编写

问题描述

我想在保持项目文件结构整洁的同时编写服务。但 Docker 似乎在构建上下文之外的路径存在问题。我正在创建一个包,并希望将所有与 Docker 相关的东西保存在项目根目录下的文件夹中。但我找不到从docker-compose和引用项目文件的方法Dockerfile。从项目创建容器文件时,必须复制。

这是我目前的项目结构:

root/
    docker/
        docker-compose.yml
        Dockerfile
        docker_resource.txt
        config
    src/
        project-files.whatever
    root-files.txt

现在如果 I$cd docker$docker-compose up,我尝试了两种可能性。我的 Dockerfile 复制文件COPY .. /path/in/container或 compose 文件具有构建指令,例如:

x-build: &my-build
    context: ..
    dockerfile: docker/Dockerfile

第一种方法不起作用。显然 Dockerfile 不能引用构建上下文之外的任何内容。第二种方法似乎有效,但只有在我将复制命令从docker_resource.txtto编辑之后docker/docker_resource.txt。理想情况下,我希望保留docker build./docker 保持事物清洁的能力——不必担心 Dockerfile 中的组合上下文。这可能吗?

至少我在寻找一种将 docker 相关文件放在任意文件夹中并能够在 compose 文件中指定构建上下文而无需额外更改的方法。

标签: dockerdocker-composedockerfile

解决方案


您需要将其视为src/project-files.whatever自给自足的最小构建。我会在 src 中放置一个 Dockerfile。它应该被视为项目的一部分,并且应该针对它。不过,您仍然需要编辑您的复制命令。

root/
    docker/
        docker-compose.yml
        docker_resource.txt
        config
    src/
        project-files.whatever
        Dockerfile
    root-files.txt

无论如何,您都希望将 compose 和 Dockerfile 和资源分开。根据里面的内容,docker_resource您可能希望将其移动到 src.src 中。将图像视为程序本身,无需配置。我建议将资源/配置内容放在一个卷中,这样您就不必在每次更改时都从头开始重建。

另一种方法是将 Dockerfile 放在上一层并允许您的根目录作为构建上下文。在这种情况下,您的结构将是这样的:

/root
    Dockerfile
    docker-compose.yml
    docker_resource.txt
    config
    src/
        project-files.whatever
    root-Files/
        root-files.txt

不确定你是否喜欢这样。


推荐阅读