与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。
答案 0 :(得分:27)
您可以将其作为构建arg传递。您的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 repo中找到一个例子:
答案 1 :(得分:0)
最终bb.bash
看起来像:
#!/bin/bash
# current uid and gid
curr_uid=`id -u`
curr_gid=`id -g`
# create bb.dockerfile:
cat << EOF2 > bb.dockerfile
FROM ubuntu:xenial-20180417
ARG UNAME=testuser
ARG UID=1000
ARG GID=1000
RUN groupadd -g \$GID \$UNAME
RUN useradd -m -u \$UID -g \$GID -s /bin/bash \$UNAME
USER \$UNAME
CMD /bin/bash
EOF2
docker build --build-arg UID=${curr_uid} --build-arg GID=${curr_gid} \
-f bb.dockerfile -t testimg .
然后另一个脚本是创建容器:
#!/bin/bash
docker run -it -d -v $(pwd)/shared:/home/testuser/shared \
--name testcontainer -P testimg