docker run如何与从容器中的shell运行命令不同

时间:2016-03-10 13:24:58

标签: shell docker permissions logstash

我遇到问题,在尝试在容器中运行logstash并访问通过主机卷提供的配置时,我获得了权限被拒绝。但是如果我在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中的环境有些不同,但我不知道会导致这些权限问题的原因。

2 个答案:

答案 0 :(得分:1)

作为第一条线索,我在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添加in the comments

  
      
  1. :Z参数添加-v修饰符可在文件和目录上设置正确的SELinux标签
  2.   
  3. logstash正在root
  4. 运行   
  5. chcon -R system_u:object_r:svirt_sandbox_file_t:s0 ./在作为主机卷挂载的每个目录上
  6.         

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

答案 1 :(得分:0)

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

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

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

你应该:

  1. 考虑使用ENTRYPOINT代替RUN

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