Dockerfile 根据文件内容设置 USR

问题描述 投票:0回答:1

我想根据文件的内容在 dockerfile 中设置用户名。

这就是我尝试过的:

...
COPY passwd_usr /root
RUN groupadd -g $(awk -F: '{print $3}' /root/passwd_usr)  users1; echo 0
RUN useradd --uid $(awk -F: '{print $3}' /root/passwd_usr) --gid $(awk -F: '{print $4}' /root/passwd_usr) $(awk -F: '{print $1}' /root/passwd_usr) 
ENV usr $(awk -F: '{print $1}' /root/passwd_usr) 
USER $usr 
RUN python${PY_VERSION} --version
...

文件

passwd_usr
包含主机系统的相关行形式
/etc/passwd

如果收到的错误消息是:

[11/15] RUN python3.11 --version:
------
dockerfile_python:39
--------------------
  37 |     RUN python${PY_VERSION} --version
  38 |     USER $usr
  39 | >>> RUN python${PY_VERSION} --version
  40 |
  41 |     WORKDIR /home/project
--------------------
ERROR: failed to solve: process "/bin/sh -c python${PY_VERSION} --version" did not complete successfully: unable to find user $(awk -F: no matching entries in passwd file
Service 'dataflow_python' failed to build : Build failed

显然这与我在以下位置找到的信息相关:https://forums.docker.com/t/how-do-i-send-runs-output-to-env-in-dockerfile/16106/2

对于其他人来说,目前(2018-06)无法将 RUN 命令期间创建的值获取到 ENV 命令中。您也不能将反引号命令作为 ENV 命令上的值运行

有没有更优雅的方法来根据此文件的输入选择用户?

dockerfile
1个回答
0
投票

我现在使用一种解决方法。在我的 dockerfile 中,我首先使用用户名定义环境变量。在我的构建脚本中,我确保在 dockerfile 中编码了正确的值。这不是一个非常优雅的解决方案,但它确实有效。

这是我的dockerfile:

ENV dousr myuser
ENV douid 1000
ENV dogid 1000
...
RUN echo  ${douid} - ${dogid} ${dousr}
RUN groupadd -g ${dogid}  users1; echo 0
RUN useradd --uid ${douid} --gid ${dogid} ${dousr}
RUN mkdir /home/project
RUN mkdir /home/${dousr}
WORKDIR  /home/project
RUN chown ${dousr}:users1  /home/project
RUN chown ${dousr}:users1  /home/${dousr}
USER ${dousr}
RUN whoami
RUN python${PY_VERSION} --version

在我的 makefile 中我使用:

me:=$(shell whoami)
my_gid:=$(shell id -g)
my_id:=$(shell id -u)


mydockerfile: FORCE ## 
    cp '$@' '$@_tmp'        
    sed -i 's/ENV[[:space:]]dousr.*/ENV dousr $(me)/' $@_tmp 
    sed -i 's/ENV[[:space:]]douid.*/ENV douid $(my_id)/' $@_tmp 
    sed -i 's/ENV[[:space:]]dogid.*/ENV dogid $(my_gid)/' $@_tmp        
    @if cmp -s  "$@_tmp" "$@"; then echo "No change"; rm $@_tmp; else rm $@; mv $@_tmp $@; fi

正如我所说,不是很优雅。但有效。有任何改进欢迎

© www.soinside.com 2019 - 2024. All rights reserved.