请教一个基础的 Docker 问题,关于容器自动创建文件夹和文件,如图所示

337 天前
 helphelp

首先,在我 Linux 的 home 目录下面,一开始是没有任何的文件夹和文件的

下面两部分代码,一个是 linuxserver 的 nginx 镜像,一个是官方版

docker run -d \
  --name=nginx \
  -e PUID=1000 \
  -e PGID=1000 \
  -e Asia/Shanghai \
  -p 80:80 \
  -p 443:443 \
  -v /home/nginx:/config \
  --restart unless-stopped \
  lscr.io/linuxserver/nginx:latest
docker run -d \
    --name nginx1 \
    --log-opt max-size=1m \
    -v /home/nginx1:/etc/nginx \
    --restart unless-stopped \
    nginx

运行之后,

linuxserver 会在 /home/nginx 里自动创建文件夹和文件(注意是文件夹和配置文件都自动创建了),

而官方版的不会自动创建文件。

如图:

请问:

1.为啥官方版的 Nginx 不会自动创建文件呢?

2.怎么让官方版的自动创建文件呢?就是 nginx.conf 这些配置文件。

2494 次点击
所在节点    程序员
35 条回复
helphelp
337 天前
以往我都是先运行一个基础容器,在`docker cp` 然后在`docker stop nginx`很是麻烦,之前一直以为是 docker 不会自动创建文件,但是当我用了 linuxserver 的镜像之后,感觉好像也不是,求解惑 谢谢各位大佬
ghostheaven
337 天前
看它的启动脚本有没有创建配置文件的部分
symbo
337 天前
hero0earth
337 天前
linuxserver 是用的 docker mount 吧,和 docker volume 不一样
hero0earth
337 天前
唐突了,mount 也不会自动创建。。
leonshaw
337 天前
写个基于 nginx 的 Dockerfile
gitignore
337 天前
本身 nginx 安装后就会在 /etc/nginx 目录生成这些文件吧,nginx docker 应该是 include 了 /config 目录,所以你要这些文件来干嘛……直接把你的配置文件丢进去不行吗


或者是在想要,试试自己写 Dockerfile ,entrypoint 加个类似命令

cp -R -u -p /etc/nginx /config

启动时会复制 config 目录不存在的文件
byron
337 天前
1. 官方版的 Nginx 镜像是最小化的,只包含 Nginx 本身和一些基本配置。它默认不会创建任何额外的文件或目录。这是为了让用户有最大的灵活性,可以自己挂载配置目录和文件。

2. 要让官方版的 Nginx 也自动创建配置文件,可以:

- 在 Dockerfile 中复制官方的默认配置文件到 image 中:

Dockerfile
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
- 或者在 docker run 的时候,同时挂载官方的默认配置文件目录:
bash
docker run -d \
--name nginx1 \
-v /home/nginx1:/etc/nginx \
-v /usr/share/nginx/html:/usr/share/nginx/html:ro \
-v /usr/share/nginx/conf.d:/etc/nginx/conf.d:ro \
--restart unless-stopped \
nginx

这样,当容器启动时,就会从宿主机上拷贝默认的配置文件到容器中,实现自动创建配置文件的效果。

结论:官方版的 Nginx 镜像更 “轻量级”,它默认不会创建额外文件,完全依赖用户的挂载。如果要自动创建配置,可以在 Dockerfile 或 docker run 中复制官方的默认配置文件到容器内。
helphelp
337 天前
@symbo 大佬牛逼 我说我一开始怎么没看到 dockerfile 里面有关于创建文件的部分,原来 Linuxserver 用了两个镜像编译的,先做了一个基础镜像,然后在基础镜像的基础上在编译一次,创建文件夹的代码是在 beseimage-nginx 里面。谢谢!

不过我在 https://github.com/linuxserver/docker-baseimage-alpine-nginx/blob/master/Dockerfile 中也没看到创建 nginx.conf 的部分,只有删除默认的 default.conf 的操作,大佬可否在指点一下,它创建 Nginx.conf 的代码在哪?
helphelp
337 天前
@gitignore 我想要 nginx 自动创建默认的 nginx.conf ,因为有时候不需要复杂的配置文件,这样用默认的就够了
helphelp
337 天前
@symbo 好像看到了 谢谢大佬
helphelp
337 天前
@byron 谢谢大佬指点,

-v /usr/share/nginx/html:/usr/share/nginx/html:ro \
-v /usr/share/nginx/conf.d:/etc/nginx/conf.d:ro \

这两行代码,首先要宿主机上要安装 Nginx 才会有吧
helphelp
337 天前
@symbo 又看不懂了 大佬看一下我#9 楼的回复 求指点谢谢
helphelp
337 天前
我问了 GPT ,GPT 说不能直接将容器的文件拷贝到宿主机上,我想知道 Linuxserver 的镜像是怎么做到自动创建文件的 大佬们

以下是 GPT 的回答

问:
dockerfile 如何将容器文件拷贝到宿主机


答:
在 Dockerfile 中,容器文件无法直接拷贝到宿主机上。Docker 建立的容器是与宿主机隔离的,它们运行在不同的命名空间中,因此无法直接访问宿主机上的文件系统。

如果需要将容器中的文件拷贝到宿主机上,可以使用 Docker 的 docker cp 命令。该命令允许将容器中的文件复制到宿主机上,或从宿主机上复制文件到容器中。
helphelp
337 天前
@leonshaw 大佬 怎么写 怎么把容器的配置文件拷贝到本地文件夹呢
liwufan
337 天前
@helphelp https://github.com/linuxserver/docker-baseimage-alpine-nginx/blob/5072e44869bc3de4231cfb73f66ed16e838c8a5d/Dockerfile#L51
在这行吧,你要自己先写好再复制到 image 里。nginx 不能自己生成配置
leonshaw
337 天前
@helphelp 没法直接写本地,要 mount 一个目录,然后容器写这个目录。说实话没看懂你需求到底是什么,为什么一定要写到主机目录。
helphelp
337 天前
@leonshaw 俺就是想要容器自己创建配置文件 我不想手动创建我懒 我希望 docker run 之后就自动创建好 我放入 html 就能用
helphelp
337 天前
@leonshaw 就像这张图里面的 nginx 文件夹一样: https://file.uhsea.com/2305/ca4cd2e176ce4d798b225b4d5e97db6534.png 容器啥的都给配置好了 我直接在 www 文件夹里面放入 html 就能访问了
leonshaw
337 天前
@helphelp 那就 image 里直接放个默认配置,或者 entrypoint 脚本里发现没有配置就创建一个默认的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/943534

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX