FROM alpine:latest
# Overide user name at build, if buil-arg no passed, will create user named `default` user
ARG DOCKER_USER=default_user
# Create a group and user
RUN addgroup -S $DOCKER_USER && adduser -S $DOCKER_USER -G $DOCKER_USER
# Tell docker that all future commands should run as the appuser user
USER $DOCKER_USER
3条答案
按热度按时间7ajki6be1#
是的,您可以从主机设置用户,但是您应该修改您的Dockerfile以处理运行时用户。
现在,构建到Docker
docker build --build-arg DOCKER_USER=$(whoami) -t docker_user .
Docker中的新用户将成为主机用户。
docker run --rm docker_user ash -c "whoami"
另一种方法只是传递并Map主机用户,而不在Dockerfile中创建用户。
您可以在docker here和here中进一步阅读有关用户的更多信息。
dgtucam12#
另一种方法是通过入口点。
示例
这个例子依赖于gosu,它出现在最近的Debian derivatives中,还没有出现在Alpine 3.13中(而是is in edge)。
您可以按如下方式运行此映像:
第一个
停靠文件
个文件/入口点
备注
UID
通常是bash中的只读变量,但如果由docker--env
标志设置,它将按预期工作gosu
是因为它很简单,但是您 * 可以 * 让它与su
或sudo
一起工作;但需要更多配置--env
开关,可以执行如下操作:--env user="$(id -u):$(id -g)"
和在entrypoint
:uid=${user%:*} gid=${user#*:}
;请注意,此时UID
变量在bash中是只读的,这就是我切换为小写的原因......其余的修改留给读者p8ekf7hl3#
没有一个简单的解决方案可以处理所有的用例,解决这些问题是一项持续的工作,是集装箱化世界生活的一部分。
没有什么神奇的参数可以添加到
docker exec
或docker run
调用中,并可靠地使容器化软件在主机Map卷上操作时不再遇到权限问题。(不要),您将遇到权限问题,您将解决这些问题,这是您应该尝试提高效率的任务,而不是试图找到一个永远不会存在的奇迹般的解决办法。