【问题标题】:Create a custom folder and assign user permission创建自定义文件夹并分配用户权限
【发布时间】:2019-11-17 18:14:57
【问题描述】:

我正在尝试自定义 Dockerfile,我只想创建一个文件夹并在新文件夹上分配用户(PID 和 GID)。

这是我完整的 Dockerfile:

FROM linuxserver/nextcloud

COPY script /home/
RUN /home/script

脚本文件内容:

#!/bin/sh
mkdir -p /data/local_data
chown -R abc:abc /data/local_data

我给了他以下权限:chmod +x script

此时它没有创建文件夹,并且我在日志中没有看到任何错误。

运行容器的命令:

docker run -d \
  --name=nextcloud \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Europe/Paris \
  -p 443:443 \
  -p 8080:80 \
  -v /home/foouser/nextcloud:/config \
  -v /home/foouser/data:/data \
  --restart unless-stopped \
  nextcloud_custom

构建日志:

Step 1/3 : FROM linuxserver/nextcloud
 ---> d1af592649f2
Step 2/3 : COPY script /home/
 ---> 0b005872bd3b
Step 3/3 : RUN /home/script
 ---> Running in 9fbd3f9654df
Removing intermediate container 9fbd3f9654df
 ---> 91cc65981944
Successfully built 91cc65981944
Successfully tagged nextcloud_custom:latest

【问题讨论】:

    标签: docker dockerfile nextcloud


    【解决方案1】:

    您正在尝试修改在基本映像中指定为 VOLUME 的文件夹,但按照 Docker documentation on Volumes

    从 Dockerfile 中更改卷:如果有任何构建步骤 更改卷内的数据在声明后,那些 更改将被丢弃。

    linuxserver/nextcloud 确实声明了一个卷 /data,之后您尝试更改它,就像这样做:

    VOLUME /data
    ...
    RUN mkdir -p /data/local_data
    

    创建的目录将被丢弃。但是,您可以通过修改目录的入口点在容器启动时创建目录,以便在容器启动时创建目录。目前linuxserver/nextcloud 使用/init 作为入口点,所以你可以这样做:

    然后定义为入口点的脚本内容:

    #!/bin/sh
    mkdir -p /data/local_data
    chown -R abc:abc /data/local_data
    
    # Call the base image entrypoint with parameters
    /init "$@"
    

    Dockerfile:

    FROM linuxserver/nextcloud
    
    # Copy the script and call it at entrypoint instead
    COPY script /home/
    ENTRYPOINT ["/home/script"]   
    

    【讨论】:

    • 我脑子里有这个解决方案,但我需要将卷从我的主机映射到 local_data
    • LinSel 解决方案就是您正在寻找的 :)
    • 感谢您的回答,但我的应用程序现在有些问题。我无法删除文件夹
    • 如果您愿意,可以创建另一个问题,您可以在评论中标记我,我很乐意为您提供帮助
    • 感谢@Pierre 的支持,如果我能先解决它,我会努力解决的:)
    【解决方案2】:

    您可以尝试直接运行命令:

    RUN mkdir -p /data/local_data && chown -R abc:abc /data/local_data
    

    你也可以尝试将你的shebang改成:

    #!/bin/bash
    

    要调试你可以尝试在你的脚本中set -x好。

    编辑:

    我在你的日志中注意到了这个Removing intermediate container,解决方法是在你的docker run 命令中使用音量:

    -v /path/your/new/folder/HOST:/path/your/new/folder/container
    

    【讨论】:

    • 我尝试直接运行命令,结果相同
    • 它是一个多阶段的 Dockerfile 吗?你能发布你的 Dockerfile 吗?
    • 这里是图片的来源github.com/linuxserver/docker-nextcloud我使用的是基础图片。我还在脚本中添加了调试模块,它没有输出错误。我问题中的 Dockerfile 是我的完整代码
    • 这并不能解决原来的问题,即卷处理问题,尽管您提出的解决方法确实提供了结果
    猜你喜欢
    • 2012-12-16
    • 2019-05-14
    • 2019-01-24
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多