关于 Docker 容器自动创建文件夹和文件的问题

2023-05-28 14:20:39 +08:00
 helphelp

重新发一下,之前发的一个帖子没表达清楚意思,顺便把大佬的回答搬过来


以下是原问题:

下面两部分代码,一个是 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 文件夹里面什么都没有

请问:

1.怎么让官方版像 linuxserver 一样自动创建文件呢?就是把容器内的 /etc/nginx/nginx.conf 这些配置文件自动拷贝或者说创建到本地。或者说 linuxserver 是怎么实现的呢?

1467 次点击
所在节点    程序员
7 条回复
helphelp
2023-05-28 14:21:22 +08:00
以下是 @javalaw2010 大佬的回答

注意一下 https://github.com/linuxserver/docker-baseimage-alpine-nginx 这个容器的构建,/root 文件加会被添加进容器和 /合并,注意 /migrations 目录下面的文件,这个文件会被更基础的镜像 https://github.com/linuxserver/docker-baseimage-alpine 的 S6 进程管理器读取,会把 nginx 的配置文件从 apt 源安装的初始目录拷贝到 /config 文件夹下面。

想要启动容器的时候自动创建文件夹的话,一种方案就是你用跟 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 14:22:09 +08:00
另外吐槽一下,为啥发帖支持 Markdown 回帖不支持...
helphelp
2023-05-28 14:26:32 +08:00
不能编辑了,想替换帖子里面那个图片的,重新截了一张

![nginx]( https://file.uhsea.com/2305/97cc78035fc6d0868a6b5b9ab91e1e63H3.png)
helphelp
2023-05-28 14:27:58 +08:00
![nginx]( )
loveqianool
2023-05-29 01:54:21 +08:00
```
sudo sh -c "echo 'docker exec -i --user="\$UID":users nginx nginx "\$@"' > /usr/local/bin/nginx" && \
sudo chmod +x /usr/local/bin/nginx && \
docker run --rm -ti xmartlabs/htpasswd admin 123456 > /opt/docker/nginx/.htpasswd && \
docker run --name tmp-nginx -d nginx:alpine && \
docker cp tmp-nginx:/etc/nginx /opt/docker && \
docker cp tmp-nginx:/usr/share/nginx/html/50x.html /opt/www/ && \
docker cp tmp-nginx:/usr/share/nginx/html/index.html /opt/www/ && \
mkdir /opt/docker/nginx/logs; \
sudo chown -R "$UID":users /opt/docker/nginx/logs && \
sudo chmod -R g+rwx /opt/docker/nginx/logs && \
docker rm -f tmp-nginx
```
kaedeair
2023-05-29 09:26:25 +08:00
https://hub.docker.com/_/nginx 中 Complex configuration 一节写了配置在 /etc/nginx/下面,其他的配置项需要自己设置和挂载相应目录
helphelp
2023-05-29 11:45:17 +08:00
@loveqianool 大佬 这是将先运行容器在 docker cp 的过程用一键脚本完成了是吧

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

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

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

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

© 2021 V2EX