我有以下设置:
selenium-chrome:
image: selenium/node-chrome-debug:3.141.59-neon
container_name: chrome-e2e
depends_on:
- selenium-hub
environment:
- HUB_HOST=selenium-hub
- HUB_PORT=4444
- SHM-SIZE=2g
- GRID_DEBUG=false
- NODE_MAX_SESSION=1
- NODE_MAX_INSTANCES=5
- TZ=Europe/Brussels
hostname: chrome-e2e
networks:
- build-network
ports:
- 5900:5900
volumes:
- ./target:/home/seluser/Downloads
硒测试在容器内部运行,实际的测试代码在容器外部。使用Maven,我们可以处理容器的生命周期。
如您所见,我将Chrome下载文件夹(位于容器内部)安装到应用程序的target
文件夹中。一切都安装正确,但是当Chrome尝试下载文件时,将拒绝写入/home/seluser/Downloads
的权限。
Docker将/home/seluser/Downloads
的UID和GID设置为2100:2100。 Chrome本身是通过seluser
用户运行的。
我该怎么做才能授予seluser
写入2100拥有的文件夹的权限?
先谢谢了。 问候
答案 0 :(得分:1)
Linux中的绑定安装在uid或gid上不执行任何命名间隔,并且主机安装在后台运行绑定安装。因此,如果容器内的uid与主机上的uid不同,则会遇到权限问题。我已经使用fix-perms脚本在其他容器中解决了这个问题。实现类似于以下Dockerfile:
FROM selenium/node-chrome-debug:3.141.59-neon
COPY --from=sudobmitch/base:scratch /usr/bin/gosu /usr/bin/fix-perms /usr/bin/
COPY entrypoint.sh /entrypoint.sh
# use a chmod here if you cannot fix permissions outside of docker
RUN chmod 755 /entrypoint.sh
USER root
ENTRYPOINT [ "/entrypoint.sh" ]
enterpoint.sh如下:
#!/bin/sh
if [ "$(id -u)" = "0" -a -d "/home/seluser/Downloads" ]; then
fix-perms -r -u seluser /home/seluser/Downloads
exec gosu seluser /opt/bin/entry_point.sh "$@"
else
exec /opt/bin/entry_point.sh "$@"
fi
这里发生的是容器以root身份启动,并且fix-perms脚本调整了容器内部的seluser
以匹配/home/seluser/Downloads
目录的uid。 exec gosu
然后以自己的用户身份运行容器进程,作为新的pid 1。
您可以在以下位置查看用于实现此目的的代码:https://github.com/sudo-bmitch/docker-base
我已经在几篇演讲中讨论了这种方法,包括:https://sudo-bmitch.github.io/presentations/dc2019/tips-and-tricks-of-the-captains.html#fix-perms
答案 1 :(得分:0)
您可以创建自己的Dockerfile:
FROM selenium/node-chrome-debug:3.141.59-neon
VOLUME /home/seluser/Downloads
和docker-compose.yml应该是:
selenium-chrome:
build: .
container_name: chrome-e2e
depends_on:
- selenium-hub
...
VOLUME指令将使用当前用户(在这种情况下为seluser)创建目录,因此Docker无需使用其他用户创建目录。