【问题标题】:Docker VOLUME for different users针对不同用户的 Docker VOLUME
【发布时间】:2015-11-25 12:40:22
【问题描述】:

我正在使用 docker 和 docker-compose 来构建我的应用程序。 github上托管的项目现在有两个开发者。

我们的项目结构是:

  • 支持
    • 码头文件
      • 开发
        • 构建
          • .profile
          • Dockerfile
        • docker-compose.yml

现在我们有这样的./dockerfiles/dev/docker-compose.yml

app:
    container_name: sup-dev
    build: ./build

./dockerfiles/dev/build/Dockerfile:

FROM sup:dev

# docker-compose tries to find .profile relative to build dir:
# ./dockerfiles/dev/build
COPY .profile /var/www/

我们像这样运行容器:

docker-compose up -d

一切正常,但由于操作系统不同,我们的代码位于不同的位置:/home/aliance/www/project 为我,/home/user/other/path/project 为第二个开发人员。所以我不能只在Dockerfile 中添加音量指令。

现在我们用这种错误的方式解决这个问题: - 我正在使用 lsyncd 和我的个人配置将文件传输到容器中 - 第二个使用volume 指令进入Dockerfile 但没有提交。

您知道如何为docker-compose 编写一个统一的Dockerfile 以将代码从不同路径输出到应用容器中吗?

【问题讨论】:

    标签: docker dockerfile docker-compose


    【解决方案1】:

    主机上的文件路径无关紧要。为什么需要绝对路径?

    您可以使用相对于 docker-compose.yml 的路径,因此对于两个开发人员来说它们应该是相同的。

    Dockerfile 中的VOLUME 指令始终与构建上下文相关,因此如果您愿意,可以使用如下内容:

    app:
        container_name: sup-dev
        build: ..
        dockerfile: build/Dockerfile
    

    这样Dockerfile 的构建上下文将是项目根目录。

    【讨论】:

    • 您好@dnephin,感谢您的回答。如果我错了,请纠正我,但是父路径会起作用吗?我记得出于安全原因,它们被禁用了。
    • 我将构建路径和ADD 指令混淆为Dockerfile。你的解决方案对我有用。我做了什么改变:1)在docker-compose.yml中我已经将build更改为../..并将dockerfile设置为./dockerfiles/dev/build和2)将.profile文件的路径更改为我的Dockerfile,现在它变得相对于构建上下文 - COPY ./dockerfiles/dev/build/.profile /var/www/ (请参阅上面我编辑的问题,我已经阐明了项目结构,它有 2 级嵌套)。现在一切看起来都不错,是吗?
    • 嗯,但不适用于音量。作为阅读hereDockerfileVOLUMEdocker-compose.ymlvolumes(与docker run -v相同)是不一样的。我想使用第二个,所以我尝试在我的docker-compose.yml 中添加这个../..:/var/www/project(注意,该路径是相对于 yml,而不是构建上下文),来自应用程序根目录(构建上下文)的所有文件都被复制到容器根路径/var/www/project,但他们将我本地主机上的所有者:组更改为www-data。没事吧?或者我该怎么办?
    • 是的,有两种类型的卷,容器卷(VOLUME in a Dockerfile)和主机卷(将主机路径挂载到容器中)。听起来你想要一个主机卷。如果他们正在更改所有权,则必须在容器中运行某些东西来改变他们的所有权。文件的所有权被保留。我应该没问题,您可以将您的用户添加到 www-group 并给他们chmod g+w 权限。
    • 是的,主机音量最适合我。不,没有人更改文件权限。我找到了您对similar problem 的回答,所以这不仅仅是我的本地 问题吗?我已经考虑将我的本地用户添加到www-data 组,但不确定这是否可以。好的,我会尝试发布反馈。感谢您的帮助!
    【解决方案2】:

    也许您应该将 Dockerfile 保留在项目的根目录中。然后您可以在 Dockerfile 中添加一条指令:

    COPY ./ /usr/src/app/
    

    或(产品中不推荐)

    VOLUME /usr/src/app
    

    +(运行容器时的选项,因为我不知道 docker-compose)

    -v /path/to/your/code:/usr/src/app
    

    【讨论】:

    • 感谢您的回答。 «您应该将 Dockerfile 放在项目的根目录» — 这不适合我。 «在 prod 中不推荐» - 这是开发平台的需要,因为只有开发平台可以在不同的环境中运行。你能用«volume path»多解释一下你的解决方案吗,不明白它对我有什么帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-10
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多