V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
helphelp
V2EX  ›  程序员

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

  •  
  •   helphelp · 2023-05-28 14:20:39 +08:00 · 1439 次点击
    这是一个创建于 549 天前的主题,其中的信息可能已经有所发展或是发生改变。

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


    以下是原问题:

    下面两部分代码,一个是 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

    请问:

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

    7 条回复    2023-05-29 11:45:17 +08:00
    helphelp
        1
    helphelp  
    OP
       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
        2
    helphelp  
    OP
       2023-05-28 14:22:09 +08:00
    另外吐槽一下,为啥发帖支持 Markdown 回帖不支持...
    helphelp
        3
    helphelp  
    OP
       2023-05-28 14:26:32 +08:00
    不能编辑了,想替换帖子里面那个图片的,重新截了一张

    ![nginx]( https://file.uhsea.com/2305/97cc78035fc6d0868a6b5b9ab91e1e63H3.png)
    helphelp
        4
    helphelp  
    OP
       2023-05-28 14:27:58 +08:00
    ![nginx]( )
    loveqianool
        5
    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
        6
    kaedeair  
       2023-05-29 09:26:25 +08:00
    https://hub.docker.com/_/nginx 中 Complex configuration 一节写了配置在 /etc/nginx/下面,其他的配置项需要自己设置和挂载相应目录
    helphelp
        7
    helphelp  
    OP
       2023-05-29 11:45:17 +08:00
    @loveqianool 大佬 这是将先运行容器在 docker cp 的过程用一键脚本完成了是吧
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3384 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:38 · PVG 19:38 · LAX 03:38 · JFK 06:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.