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 运行 时间创建的容器内的文件将可以在已安装的卷中访问,因此可以在容器内和主机上访问。
您应该:
考虑使用 ENTRYPOINT
而不是 RUN
如果您只需要在容器之间共享文件,请使用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
这可以解释 logstash
和 sh -c 'logstash...'
之间的区别:第一个参数不再是 logstash
。
因此您需要确保 $PWD/logstash/config
安装后可供用户“logstash
”访问。
OP Mark Caudill adds :
- adding
:Z
modifier to the -v
parameter sets the correct SELinux labels on the files and directories
- logstash is running as
root
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.
我在尝试 运行 容器内的 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 运行 时间创建的容器内的文件将可以在已安装的卷中访问,因此可以在容器内和主机上访问。
您应该:
考虑使用
ENTRYPOINT
而不是RUN
如果您只需要在容器之间共享文件,请使用
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
这可以解释 logstash
和 sh -c 'logstash...'
之间的区别:第一个参数不再是 logstash
。
因此您需要确保 $PWD/logstash/config
安装后可供用户“logstash
”访问。
OP Mark Caudill adds
- adding
:Z
modifier to the-v
parameter sets the correct SELinux labels on the files and directories- logstash is running as
root
chcon -R system_u:object_r:svirt_sandbox_file_t:s0 ./
on each directory being mounted as a host volumeThese points allow the
logstash
process to access the host volume.