Docker卷权限问题

4
我正在尝试启动一个使用WildFly18部署在Docker容器中的应用程序,该应用程序在内部连接到我的主机PostgreSQL数据库。在容器创建过程中,我还通过使用docker volume create命令创建命名卷,将容器的WildFly日志目录映射到我的本地即“主机”目录。
问题是,当应用程序运行并且容器试图在映射的卷内创建日志文件时,出现了"permission denied"错误。
我的Dockerfile内容如下:
FROM jboss/base-jdk:8

ENV WILDFLY_VERSION 18.0.1.Final
ENV WILDFLY_SHA1=ef0372589a0f08c36b15360fe7291721a7e3f7d9
ENV JBOSS_HOME /opt/jboss/wildfly

USER root

RUN cd $HOME \
    && curl -O https://download.jboss.org/wildfly/$WILDFLY_VERSION/wildfly-$WILDFLY_VERSION.tar.gz \
    && sha1sum wildfly-$WILDFLY_VERSION.tar.gz | grep $WILDFLY_SHA1 \
    && tar xf wildfly-$WILDFLY_VERSION.tar.gz \
    && mv $HOME/wildfly-$WILDFLY_VERSION $JBOSS_HOME \
    && rm wildfly-$WILDFLY_VERSION.tar.gz 

COPY ./bin $JBOSS_HOME/bin
COPY ./standalone/configuration/* $JBOSS_HOME/standalone/configuration/
COPY ./modules/com $JBOSS_HOME/modules/com
COPY ./modules/system/layers/base/org/ $JBOSS_HOME/modules/system/layers/base/org/
COPY ./standalone/waffle_resource $JBOSS_HOME/standalone/waffle_resource
COPY ./standalone/waffle_resource/waffle.ear $JBOSS_HOME/standalone/deployments/
COPY ./standalone/waffle_resource/waffle-war.ear $JBOSS_HOME/standalone/deployments/

RUN chown -R jboss:jboss ${JBOSS_HOME} && chmod -R g+rw ${JBOSS_HOME}

ENV LAUNCH_JBOSS_IN_BACKGROUND true

USER jboss

EXPOSE 8989 9990

WORKDIR $JBOSS_HOME/bin

CMD ["/opt/jboss/wildfly/bin/standalone.sh", "-b", "0.0.0.0"]

如上所示,我在容器中使用用户JBOSS来启动WildFly。 创建镜像和运行容器以及创建卷使用的命令如下:

docker image build -t viaduct/wildfly .

docker volume create viaduct-wildfly-logs

docker run -d -v viaduct-wildfly-logs:/opt/jboss/wildfly/standalone/log --network=host \
  -e "DB_DBNAME=dbname" \
  -e "DB_PORT=5432" \
  -e "DB_USER=xyz" \
  -e "DB_PASS=" \
  -e "DB_HOST=127.0.0.1" \
  --name petes viaduct/wildfly

我核实了由docker volume create命令创建的容器内部和本地“host”目录的权限。另外值得注意的是,

我以用户JBOSS身份运行wildlfy

.

容器的权限如下:

[jboss@localhost /]$ ll /opt/jboss/wildfly/standalone/
total 4
drwxrwxr-x 1 jboss jboss   62 Sep 18 00:24 configuration
drwxr-xr-x 6 jboss jboss   84 Sep 18 00:23 data
drwxrwxr-x 1 jboss jboss   64 Sep 18 00:24 deployments
drwxrwxr-x 1 jboss jboss   17 Nov 15  2019 lib
*drwxr-xr-x 2 root  root     6 Sep 17 23:48 log*
drwxrwxr-x 1 jboss jboss 4096 Sep 18 00:24 tmp
drwxrwxr-x 1 jboss jboss   98 Sep 18 00:23 waffle_resource
[jboss@localhost /]$ exit

本地卷权限如下:

[root@localhost xyz]# cd /var/lib/docker/volumes/
[root@localhost volumes]# ll
drwxrwsr-x 3 root root    19 Sep 18 11:48 viaduct-wildfly-logs

docker volume create 命令会在本地机器创建以下目录: /var/lib/docker/volumes/viaduct-wildfly-logs/_data 默认情况下,每个子目录的权限如下所示,这显然是为安全原因而保留的:
drwx--x--x  14 root root   182 Sep 14 09:32 docker
   drwx------  7 root root   285 Sep 18 11:48 volumes
      drwxrwsr-x 3 root root    19 Sep 18 11:48 viaduct-wildfly-logs

首先,请告诉我我的策略是否正确?

其次,告诉我解决权限问题的最佳方法是什么?

1个回答

6

您需要创建一个具有相同UID/GID的用户,并在主机文件夹上为此卷授予权限。

服务器以jboss用户身份运行,其UID/GID设置为1000。doc


成功了!谢谢。我在本地目录中将owner:user更改为chown 1000:1000 -R viaduct-wildfly-logs/值得注意的是UID/GID必须与容器相同(不一定是用户名)。 - Pedroman
这个不能自动化吗?我还需要手动更改UID/GID吗? - Pedroman
是的,在启动Wildfly之前可以使用脚本作为入口点,但我没有尝试过这个。 - Cyril G.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接