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

2023-05-28 08:35:20 +08:00
 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 这些配置文件。

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


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

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

启动时会复制 config 目录不存在的文件
byron
2023-05-28 09:41:12 +08:00
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
2023-05-28 10:01:12 +08:00
@symbo 大佬牛逼 我说我一开始怎么没看到 dockerfile 里面有关于创建文件的部分,原来 Linuxserver 用了两个镜像编译的,先做了一个基础镜像,然后在基础镜像的基础上在编译一次,创建文件夹的代码是在 beseimage-nginx 里面。谢谢!

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

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

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

以下是 GPT 的回答

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


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

如果需要将容器中的文件拷贝到宿主机上,可以使用 Docker 的 docker cp 命令。该命令允许将容器中的文件复制到宿主机上,或从宿主机上复制文件到容器中。
helphelp
2023-05-28 10:21:50 +08:00
@leonshaw 大佬 怎么写 怎么把容器的配置文件拷贝到本地文件夹呢
liwufan
2023-05-28 10:32:23 +08:00
@helphelp https://github.com/linuxserver/docker-baseimage-alpine-nginx/blob/5072e44869bc3de4231cfb73f66ed16e838c8a5d/Dockerfile#L51
在这行吧,你要自己先写好再复制到 image 里。nginx 不能自己生成配置
leonshaw
2023-05-28 10:35:07 +08:00
@helphelp 没法直接写本地,要 mount 一个目录,然后容器写这个目录。说实话没看懂你需求到底是什么,为什么一定要写到主机目录。
helphelp
2023-05-28 10:55:21 +08:00
@leonshaw 俺就是想要容器自己创建配置文件 我不想手动创建我懒 我希望 docker run 之后就自动创建好 我放入 html 就能用
helphelp
2023-05-28 10:58:00 +08:00
@leonshaw 就像这张图里面的 nginx 文件夹一样: https://file.uhsea.com/2305/ca4cd2e176ce4d798b225b4d5e97db6534.png 容器啥的都给配置好了 我直接在 www 文件夹里面放入 html 就能访问了
leonshaw
2023-05-28 11:06:54 +08:00
@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