请教一个基础的 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 这些配置文件。

2916 次点击
所在节点    程序员
35 条回复
helphelp
2023-05-28 11:06:57 +08:00
@leonshaw 就像你直接用 apt install nginx 安装它会在本地 /usr/share/nginx/conf.d 给你创建好基本的.conf 配置文件对吧,不需要你手动创建,但是 docker 版的官方 nginx 镜像它默认不创建,我想让他自动创建
liwufan
2023-05-28 11:11:40 +08:00
nginx 没法自动创建, /usr/share/nginx/conf.d 是 apt 维护者自己写的。你去 nginx 或者 arch Linux 下载 tarball 里面都是没有这种配置文件的
helphelp
2023-05-28 11:42:55 +08:00
@liwufan 原来是这样啊 谢谢大佬了 那 linuxserver 的 Nginx 镜像是怎么做到 docker run 的时候 自动在宿主机创建文件的
xiaomingVTEX
2023-05-28 11:54:41 +08:00
@helphelp #14 不是应该问 dockerfile 如何将宿主机文件拷贝到容器吗
helphelp
2023-05-28 11:59:13 +08:00
@xiaomingVTEX 可是我本地没有文件,我想知道 linuxserver 他们是怎么做到把容器里面的文件创建到本地的
helphelp
2023-05-28 12:01:29 +08:00
@xiaomingVTEX 怎么让官方版 nginx 像 linuxserver 版 nginx 一样自动创建文件呢?就是把 /etc/nginx/nginx.conf 这些配置文件自动拷贝或者说创建到本地。
512357301
2023-05-28 12:02:03 +08:00
你这映射的容器里的目录都不一样,没有可比性吧,而且即使映射的同一个容器内目录,不同的镜像有不同的规则,也可能出现不创建的情况,具体得以镜像的逻辑为准。
映射的本质是让镜像读写本地的文件,默认是读,如果本地是空,有的镜像会把默认值写入,有的则不写,具体以镜像逻辑为准。
symbo
2023-05-28 12:04:15 +08:00
@helphelp nginx.conf 是不是 apk 装 nginx 装进去的啊?
helphelp
2023-05-28 12:09:34 +08:00
## 重新整理一下问题,刚刚可能没表达清楚

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

```
docker run -d \
--name=nginx \
-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
```
开始的时候我的 home 目录是空白的,什么都没有
运行这两个容器之后,

linuxserver 会在 /home/nginx 里自动创建文件夹和文件(注意是文件夹和配置文件都自动创建了),
**而官方版的不会自动创建文件。**
如图:

nginx 文件夹下面有很多文件,都是容器自动创建的,但是 nginx1 文件夹里面什么都没有

![nginx]( https://file.uhsea.com/2305/ca4cd2e176ce4d798b225b4d5e97db6534.png)


**请问:**


**1.怎么让官方版像 linuxserver 一样自动创建文件呢?就是把容器内的 /etc/nginx/nginx.conf 这些配置文件自动拷贝或者说创建到本地。**
javalaw2010
2023-05-28 12:13:37 +08:00
注意一下 https://github.com/linuxserver/docker-baseimage-alpine-nginx 这个容器的构建,/root 文件加会被添加进容器和 /合并,注意 /migrations 目录下面的文件,这个文件会被更基础的镜像 https://github.com/linuxserver/docker-baseimage-alpine-nginx 的 S6 进程管理器读取,会把 nginx 的配置文件从 apt 源安装的初始目录拷贝到 /config 文件夹下面。
javalaw2010
2023-05-28 12:16:29 +08:00
@javalaw2010 #30 第二个镜像应该是 https://github.com/linuxserver/docker-baseimage-alpine ,复制错了。
javalaw2010
2023-05-28 12:24:07 +08:00
想要启动容器的时候自动创建文件夹的话,一种方案就是你用跟 linuxserver 一样的进程管理器的方案,然后写一些启动脚本让它读取。还有一种更轻量级的方案就是写一个 docker-entrypoint.sh 脚本,作为容器的 entrypoint ,在这个里面做一些初始化的工作,然后用 gosu 和 exec 命令执行 command ,实际的使用示例可以看这个: https://github.com/laravel/sail/blob/1.x/runtimes/8.2/start-container
helphelp
2023-05-28 13:49:56 +08:00
@javalaw2010 大佬牛逼 谢谢 大概明白怎么回事了 意思就是容器执行的时候顺带执行了脚本对吗
liwufan
2023-05-28 14:09:39 +08:00
Alpine > baseimage > baseimage-nginx > linuxserver-nginx
/config 目录是 linuxserver 自定义出来的路径,目的是在单机上让一个 compose 文件一口气拉起一大坨容器。
https://github.com/linuxserver/docker-baseimage-alpine/blob/a0d322b3050123260b41000840c58362c688d509/Dockerfile#L90
helphelp
2023-05-28 14:29:36 +08:00
@liwufan 谢大佬解答

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

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

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

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

© 2021 V2EX