docker运行如何与容器中的shell运行命令有所不同

当我试图在容器中运行logstash并访问通过主机卷提供的configuration时,我遇到了拒绝权限的问题。 但是,如果我明确地运行在一个shell内的命令,它工作正常。

$ docker run -it --rm -v "$PWD/logstash/config":/etc/logstash/conf.d:Z logstash:latest logstash -f /etc/logstash/conf.d The error reported is: Permission denied - /etc/logstash/conf.d/logstash.conf $ docker run -it --rm -v "$PWD/logstash/config":/etc/logstash/conf.d:Z logstash:latest sh -c 'logstash -f /etc/logstash/conf.d' Settings: Default pipeline workers: 4 Logstash startup completed $ docker run -it --rm -v "$PWD/logstash/config":/etc/logstash/conf.d:Z logstash:latest ls -lZ /etc/logstash/conf.d total 4 -rw-------. 1 1000 1000 system_u:object_r:svirt_sandbox_file_t:s0:c78,c159 125 Mar 9 17:57 logstash.conf 

这告诉我,shell中的环境有些不同,但我不知道会导致这些权限问题。

作为第一条线索,我在logstash Dockerfile看到它的ENTRYPOINTdocker-entrypoint.sh

 # Run as user "logstash" if the command is "logstash" if [ "$1" = 'logstash' ]; then set -- gosu logstash "$@" fi 

这将解释logstashsh -c 'logstash...'之间的区别:第一个参数不再是logstash

所以你需要确保$PWD/logstash/config一旦挂载,就可以访问用户的logstash


OP Mark Caudill 在评论中补充道:

  1. -v参数中添加:Z修饰符,在文件和目录上设置正确的SELinux标签
  2. logstash以root身份运行
  3. chcon -R system_u:object_r:svirt_sandbox_file_t:s0 ./在作为主机卷安装的每个目录上

这些点允许logstash进程访问主机卷。

我不完全了解你的问题,但这应该有帮助…

RUNDOCKER BUILD时间在容器内运行指定的命令。 在DOCKER RUN时, DOCKER RUN在容器内运行指定的命令。

装入卷时,映像中存在的文件(构build时)中的文件将被覆盖。 在docker运行时创build的容器中的文件将可以在装入的卷中访问,因此可以在容器内部和主机上访问。

你应该:

  1. 考虑使用ENTRYPOINT而不是RUN

  2. 如果您只需要在容器之间共享文件,请使用volumes-from