gpt4 book ai didi

Dockerfile 将主机用户 UID 和 GID 复制到镜像

转载 作者:IT老高 更新时间:2023-10-28 12:42:57 26 4
gpt4 key购买 nike

类似于 SO post about replicating UID/GID in container from host但是如何使用具有复制 UID 和 GID 的用户构建镜像?最好,你如何使用 dockerfile 来做这件事?

我可以使用 bash 脚本来完成:

#!/bin/bash

# current uid and gid
curr_uid=`id -u`
curr_gid=`id -g`

# create bb.dockerfile:
cat << EOF1 > bb.dockerfile
FROM ubuntu:xenial-20170214
ARG UNAME=testuser
EOF1

echo ARG UID=${curr_uid} >> bb.dockerfile
echo ARG GID=${curr_gid} >> bb.dockerfile

cat << EOF2 >> bb.dockerfile
RUN groupadd -g \$GID \$UNAME
RUN useradd -m -u \$UID -g \$GID -s /bin/bash \$UNAME
USER \$UNAME
CMD /bin/bash
EOF2

docker build -f bb.dockerfile -t testimg .

这个 bash 将生成一个如下所示的 docker 文件并在其上构建。

 FROM ubuntu:xenial-20170214
ARG UNAME=testuser
ARG UID=1982
ARG GID=1982
RUN groupadd -g $GID $UNAME
RUN useradd -m -u $UID -g $GID -s /bin/bash $UNAME
USER $UNAME
CMD /bin/bash

我要的是从 dockerfile 中删除硬编码的主机 UID 1982 和 GID 1982。

最佳答案

您可以将其作为构建参数传递。你的 Dockerfile 可以是静态的:

FROM ubuntu:xenial-20170214
ARG UNAME=testuser
ARG UID=1000
ARG GID=1000
RUN groupadd -g $GID -o $UNAME
RUN useradd -m -u $UID -g $GID -o -s /bin/bash $UNAME
USER $UNAME
CMD /bin/bash

然后您将在构建命令中传递选项:

docker build --build-arg UID=$(id -u) --build-arg GID=$(id -g) \
-f bb.dockerfile -t testimg .

请注意,我已经以不同的方式解决了与此类似的问题,方法是以 root 身份运行一个入口点,该入口点查看主机卷挂载的文件/目录权限,并调整容器内用户的 uid/gid 以匹配卷 uid/gid。进行该更改后,它会放弃从 root 用户到修改后的 uid/gid 用户的访问权限,并运行原始命令/入口点。结果是图像可以在任何开发人员机器上不加改变地运行。这方面的一个例子可以在我的 jenkins-docker 仓库中找到:

https://github.com/sudo-bmitch/jenkins-docker

关于Dockerfile 将主机用户 UID 和 GID 复制到镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44683119/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com