docker不在nginx html根目录中创建文件夹
我正在尝试创建一个nginx docker容器(提供文件上传/下载)。 在html根目录下,我希望创建一些附加的子文件夹(上传和下载) 我以nginx docker图像为基础,添加了一些额外的行来创建/初始化子文件夹docker不在nginx html根目录中创建文件夹,nginx,docker,docker-compose,centos7,Nginx,Docker,Docker Compose,Centos7,我正在尝试创建一个nginx docker容器(提供文件上传/下载)。 在html根目录下,我希望创建一些附加的子文件夹(上传和下载) 我以nginx docker图像为基础,添加了一些额外的行来创建/初始化子文件夹 FROM nginx MAINTAINER Carl Wainwright <carl.wainwright@ipaccess.com> ENV HTML_PATH /var/www/html COPY nginx.conf /etc/nginx/nginx.con
FROM nginx
MAINTAINER Carl Wainwright <carl.wainwright@ipaccess.com>
ENV HTML_PATH /var/www/html
COPY nginx.conf /etc/nginx/nginx.conf
RUN mkdir -p $HTML_PATH/upload && mkdir -p $HTML_PATH/download
RUN chmod 755 $HTML_PATH/upload && mkdir chmod 755 $HTML_PATH/download
RUN chown nginx:nginx $HTML_PATH/upload && chown nginx:nginx $HTML_PATH/download
我的nginx配置具有以下服务器配置
server {
error_log /var/log/nginx/error.log debug;
access_log /var/log/nginx/access.log main;
# Running port
listen 8081;
# Proxy requests to get SDP's
location ~ \.sdp {
root /var/www/html;
try_files $uri =404;
limit_except GET { deny all; }
}
# Proxy requests to put APD's.
location ~ \.(apd) {
dav_methods PUT;
limit_except PUT { deny all; }
client_body_temp_path /tmp/files/;
client_body_in_file_only on;
client_body_buffer_size 128K;
client_max_body_size 30M;
}
在我的本地计算机上/www数据存在并具有写入权限。
每次我打开容器时,/www数据的内容都是空的
为什么我不能在/var/www/html/下创建文件夹?是什么阻止了我这么做
注意:作为故障排除的一部分,我基于centos创建了一个docker映像,并从软件包中安装了nginx。我遇到了相同的问题。Dockerfile创建了一个映像,这是用于运行容器的定义,而不是容器本身,并且每次映像创建只运行一次。因此,所有的
RUN
命令都发生在那里,并使用您期望的目录更新您的图像
在创建容器的docker-compose.yml中,您有一个主机卷装载。卷是在容器上执行的,而不是映像生成,因此在Dockerfile的RUN
命令更新映像后,将装入此目录。对于主机卷,主机上该目录的内容完全覆盖映像的内容,它们不会被删除,但您将无法在装载该卷的任何容器中看到它们。如果您使用了命名卷,并且该命名卷恰好为空(例如,在您第一次创建该卷之后),Docker将包含一项功能,用于在将映像目录的内容装载到容器之前将其复制到卷中
因此,您的3个选项是:
/www-data
更改为名称www-data
一样简单。如果您这样做,您将无法从主机轻松管理该文件夹的内容,Docker将通过其内部目录结构对其进行管理,您将希望通过容器对其进行管理chmod
或chown
命令修复的权限和uid错误将文件夹从主机装载到容器时,将以主机文件夹内容为准,并且您将看不到装载之前创建的容器文件夹。现在非常有意义。我现在了解了主机卷装载覆盖映像文件夹的问题。对于我的设置,容器运行后,我不需要修改html根目录的内容。我只需要公开html根目录的内容。从你的解释来看,选项2)似乎是我所需要的。当你说命名卷时,你是指使用Dockerfile中的卷吗?我忘了提到一旦容器启动并运行,我需要读/写装载卷的能力。如果你在Dockerfile中声明卷,默认情况下它没有名称,但每次运行容器时都会创建一个匿名guid卷。我不推荐这个。如上所述,在docker-compose.yml中将卷源从
/www-data
更改为www-data
,它将为您创建一个命名卷。如果不希望特定容器具有卷的rw访问权限,则可以在卷装载的末尾指定:ro
。错误:命名卷“www-data:/var/wwwi/html:rw”用于服务“wbh设备资产服务器”但是在volumes部分中找不到声明。我在Dockerfile中添加了volumes:部分以解决此错误。我假设如果我想备份挂载内容,我会从源路径(在docker inspect output中找到)归档_data文件夹的内容。
server {
error_log /var/log/nginx/error.log debug;
access_log /var/log/nginx/access.log main;
# Running port
listen 8081;
# Proxy requests to get SDP's
location ~ \.sdp {
root /var/www/html;
try_files $uri =404;
limit_except GET { deny all; }
}
# Proxy requests to put APD's.
location ~ \.(apd) {
dav_methods PUT;
limit_except PUT { deny all; }
client_body_temp_path /tmp/files/;
client_body_in_file_only on;
client_body_buffer_size 128K;
client_max_body_size 30M;
}