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
看到它的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 在评论中补充道:
- 在
-v
参数中添加:Z
修饰符,在文件和目录上设置正确的SELinux标签- logstash以
root
身份运行chcon -R system_u:object_r:svirt_sandbox_file_t:s0 ./
在作为主机卷安装的每个目录上这些点允许
logstash
进程访问主机卷。
我不完全了解你的问题,但这应该有帮助…
RUN
在DOCKER BUILD
时间在容器内运行指定的命令。 在DOCKER RUN
时, DOCKER RUN
在容器内运行指定的命令。
装入卷时,映像中存在的文件(构build时)中的文件将被覆盖。 在docker运行时创build的容器中的文件将可以在装入的卷中访问,因此可以在容器内部和主机上访问。
你应该:
-
考虑使用
ENTRYPOINT
而不是RUN
-
如果您只需要在容器之间共享文件,请使用
volumes-from