我遇到问题,在尝试在容器中运行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中的环境有些不同,但我不知道会导致这些权限问题的原因。
答案 0 :(得分:1)
作为第一条线索,我在logstash Dockerfile
中看到其ENTRYPOINT
为docker-entrypoint.sh
# Run as user "logstash" if the command is "logstash"
if [ "$1" = 'logstash' ]; then
set -- gosu logstash "$@"
fi
这可以解释logstash
和sh -c 'logstash...'
之间的区别:第一个参数不再是logstash
。
因此,您需要确保$PWD/logstash/config
一旦安装,即可由用户“logstash
”访问。
OP Mark Caudill添加in the comments:
- 向
:Z
参数添加-v
修饰符可在文件和目录上设置正确的SELinux标签- logstash正在
运行root
- 醇>
chcon -R system_u:object_r:svirt_sandbox_file_t:s0 ./
在作为主机卷挂载的每个目录上这些点允许
logstash
进程访问主机卷。
答案 1 :(得分:0)
我不完全理解你的问题,但这应该有帮助...
RUN
在DOCKER BUILD
时间在容器内运行指定的命令。 ENTRYPOINT
在DOCKER RUN
时间在容器内运行指定的命令。
安装卷时,将覆盖映像内部(构建时)容器内的文件。在docker运行时创建的容器内的文件可以在已安装的卷中访问,因此可以在容器内部和主机中访问。
你应该:
考虑使用ENTRYPOINT
代替RUN
如果您只需要在容器之间共享文件,请使用volumes-from