我想根据文件的内容在 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 中,我首先使用用户名定义环境变量。在我的构建脚本中,我确保在 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
正如我所说,不是很优雅。但有效。有任何改进欢迎