【发布时间】:2018-12-06 10:57:34
【问题描述】:
我正在使用 Apache / MySql Docker-compose 设置,这一切都很好。然而问题来了,因为这是用于本地开发,Web 容器指向一个本地文件夹,我需要 Apache 拥有该文件夹的权限。
使用
RUN mkdir /www \
&& chown -R apache:apache /www
VOLUME ["/www"]
如果我自己运行 Apache dockerfile 或者如果我在 docker-compose 中运行它而不指定卷,则很好。但这意味着我不能将该卷指向本地目录,在这种情况下,“www”存在于容器内,但不映射到主机。如果我在 docker-compose 文件中指定一个卷,那么它会按预期映射,但不允许我 CHOWN 文件夹/文件(即使我执行到容器中)
以下是概念证明,我在 Windows 10 / Docker Desktop Community Version 2.0.0.0-win81 (29211) 上运行
编辑(评论暴露端口,从 docker-compose 构建 dockerfile 并将端口从 81 更改为 80)
编辑(我已经更新了以下文件,见底部,我将这些留给后代)
docker-compose.yml
version: '3.2'
services:
web:
restart: always
build:
context: .
ports:
- 80:80
volumes:
- ./:/www
Dockerfile
FROM centos:centos6 as stage1
RUN yum -y update && yum clean all \
&& yum --setopt=tsflags=nodocs install -y yum-utils \
httpd \
php
FROM stage1 as stage2
RUN mkdir /www \
&& chown -R apache:apache /www
#VOLUME ["/www"]
#EXPOSE 80
ENTRYPOINT ["/usr/sbin/httpd", "-D", "FOREGROUND"]
更新的概念证明文件
Docker-compose.yml
version: '3.2'
services:
web:
build:
context: .
ports:
- 80:80
volumes:
- ./:/www
Dockerfile
FROM centos:centos6
RUN yum -y update && yum clean all \
&& yum --setopt=tsflags=nodocs install -y yum-utils \
httpd \
php
COPY ./entrypoint.sh /
ENTRYPOINT ["/entrypoint.sh"]
entrypoint.sh
#!/bin/bash
set -e #exit straight away if there's an issue
chown -R apache:apache /www
# Apache
/usr/sbin/httpd -D FOREGROUND
【问题讨论】:
-
为什么要定义两次 www 卷?
-
另外 mkdir www 没有任何意义,因为那是一个卷,所以它只会被覆盖。您想要对卷目录进行的任何更改都应该在 docker-compose 完成卷之后从入口点完成
-
您还将端口 80 暴露到 80 并映射 81:80,这令人困惑,我猜您不想这样做,这是一个错误。如果您确实想这样做,尽管您应该同时从 compose.yml 文件中进行,而不是从 yml 中进行一项,在 dockerfile 中进行一项
-
另一件事,您在 yml 文件中定义了一个图像而不是构建,这至少可以说是奇怪的。您是从 docker 文件构建图像,然后使用 docker-compose 来处理该图像吗?对不起所有的cmets,我一直看到奇怪的东西
-
@GeorgeAppleton www 在构建文件中定义,因此我在 Apache 容器中的某个位置知道其名称。 81:80 只是一个本地配置更改(我在主机上的端口 80 上运行了一些东西)我想我应该更清楚地证明概念我将 dockerfile 构建为“poc”然后我将其用作图像码头工人撰写文件
标签: docker docker-compose dockerfile