docker 运行 与容器内的 shell 命令的 运行 有何不同

How does docker run differ from running a command from a shell within the container

我在尝试 运行 容器内的 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 中的环境有些不同,但我不知道什么会导致这些权限问题。

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

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

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

您应该:

  1. 考虑使用 ENTRYPOINT 而不是 RUN

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

作为第一条线索,我在 logstash Dockerfile that its ENTRYPOINT is docker-entrypoint.sh

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

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

因此您需要确保 $PWD/logstash/config 安装后可供用户“logstash”访问。


OP Mark Caudill adds :

  1. adding :Z modifier to the -v parameter sets the correct SELinux labels on the files and directories
  2. logstash is running as root
  3. chcon -R system_u:object_r:svirt_sandbox_file_t:s0 ./ on each directory being mounted as a host volume

These points allow the logstash process to access the host volume.