docker 不在 nginx html root 中创建文件夹
docker does not create folder in nginx html root
我正在尝试创建一个 nginx docker 容器(以提供文件 upload/download)。
在 html 根目录下,我希望创建一些额外的子文件夹(上传和下载)。
我以 nginx docker 图像为基础,并向 create/initialise 子文件夹添加了一些额外的行。
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
在我的 docker-compose 文件中,我按如下方式创建我的容器:
wbh-device-asset-server:
restart: always
image: wbh-device-asset-server/nginx:test
container_name: wbh-device-asset-server
volumes:
- /www-data:/var/www/html
ports:
- "8081:8081"
networks:
- mynetwork
我的 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-data 存在并具有写入权限。
每次我打开容器时 /www-data 的内容都是空的。
为什么我无法在 /var/www/html/ 下创建文件夹?是什么阻止我这样做。
注意:作为故障排除的一部分,我创建了一个基于 centos 的 docker 映像并从软件包中安装了 nginx,但我遇到了同样的问题。
Docker 文件创建一个图像,这是用于 运行 容器的定义,而不是容器本身,并且每个图像创建仅 运行 一次。所以所有 RUN
命令都发生在那里,并用你期望的目录更新你的图像。
在创建容器的 docker-compose.yml 中,您有一个主机卷挂载。卷是在容器上执行的,而不是图像构建,所以这个目录是在你的 Docker 文件的 RUN
命令已经更新图像之后安装的。对于主机卷,主机上该目录的内容完全覆盖了映像的内容,它们不会被删除,但您将无法在安装了该卷的任何容器中看到它们。如果您使用了命名卷,而该命名卷恰好是空的,例如在您第一次创建它之后,Docker 包含一个功能,可以在将其安装到您的容器之前将图像目录的内容复制到卷中。
所以你的 3 个选项是:
根本不使用卷,您的文件将可见。如果您想在容器之间保留此数据,则不推荐使用。
使用命名卷。这就像将卷源从完全限定的目录 /www-data
更改为名称 www-data
一样简单。如果这样做,您将无法从主机轻松管理该文件夹的内容,Docker 将通过其内部目录结构对其进行管理,而您将希望通过容器对其进行管理。
只需将所需文件添加到主机上的目录即可。这是刚开始时最简单的解决方案,但请注意主机上的用户可能与容器中的用户不匹配,因此您可能会看到需要使用 chmod
或修复的权限和 uid 错误chown
命令。
我正在尝试创建一个 nginx docker 容器(以提供文件 upload/download)。 在 html 根目录下,我希望创建一些额外的子文件夹(上传和下载)。
我以 nginx docker 图像为基础,并向 create/initialise 子文件夹添加了一些额外的行。
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
在我的 docker-compose 文件中,我按如下方式创建我的容器:
wbh-device-asset-server:
restart: always
image: wbh-device-asset-server/nginx:test
container_name: wbh-device-asset-server
volumes:
- /www-data:/var/www/html
ports:
- "8081:8081"
networks:
- mynetwork
我的 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-data 存在并具有写入权限。 每次我打开容器时 /www-data 的内容都是空的。
为什么我无法在 /var/www/html/ 下创建文件夹?是什么阻止我这样做。
注意:作为故障排除的一部分,我创建了一个基于 centos 的 docker 映像并从软件包中安装了 nginx,但我遇到了同样的问题。
Docker 文件创建一个图像,这是用于 运行 容器的定义,而不是容器本身,并且每个图像创建仅 运行 一次。所以所有 RUN
命令都发生在那里,并用你期望的目录更新你的图像。
在创建容器的 docker-compose.yml 中,您有一个主机卷挂载。卷是在容器上执行的,而不是图像构建,所以这个目录是在你的 Docker 文件的 RUN
命令已经更新图像之后安装的。对于主机卷,主机上该目录的内容完全覆盖了映像的内容,它们不会被删除,但您将无法在安装了该卷的任何容器中看到它们。如果您使用了命名卷,而该命名卷恰好是空的,例如在您第一次创建它之后,Docker 包含一个功能,可以在将其安装到您的容器之前将图像目录的内容复制到卷中。
所以你的 3 个选项是:
根本不使用卷,您的文件将可见。如果您想在容器之间保留此数据,则不推荐使用。
使用命名卷。这就像将卷源从完全限定的目录
/www-data
更改为名称www-data
一样简单。如果这样做,您将无法从主机轻松管理该文件夹的内容,Docker 将通过其内部目录结构对其进行管理,而您将希望通过容器对其进行管理。只需将所需文件添加到主机上的目录即可。这是刚开始时最简单的解决方案,但请注意主机上的用户可能与容器中的用户不匹配,因此您可能会看到需要使用
chmod
或修复的权限和 uid 错误chown
命令。