Dockerfile在“docker run”时覆盖env var

时间:2018-02-04 16:43:34

标签: docker dockerfile

Dockerfile

FROM ubuntu
ENV UID "1234"
ENV USERNAME "default"

RUN addgroup $USERNAME && useradd -u $UID -g $USERNAME -ms /bin/bash $USERNAME
CMD ["/usr/bin/id", "-u", "myname"]

并通过以下方式运行docker:

docker build -t setuser .    
docker run -e UID=5555 -e USERNAME=myname setuser

输出

/usr/bin/id: 'myname': no such user

此错误告诉我Dockerfile中的useradd在“docker run”期间未执行。

我怎么能实现这个目标?

CMD ["/usr/bin/id", "-u", "default"]有效但我希望能够在运行时提供UID和USERNAME,而不是在Dockerfile构建时提供

2 个答案:

答案 0 :(得分:4)

详细说明Henry's answer

在构建图像时执行Dockerfile的以下部分。

FROM ubuntu
ENV UID "1234"
ENV USERNAME "default"

RUN addgroup $USERNAME && useradd -u $UID -g $USERNAME -ms /bin/bash $USERNAME

所以,这次,UID=1234&已设置USERNAME=default

运行图像时,它以ENTRYPOINT& CMD。它对RUN addgroup $USERNAME ...

没有影响

所以你需要运行一个脚本来使用你传递的ENV。

#!/bin/bash

addgroup $USERNAME && useradd -u $UID -g $USERNAME -ms /bin/bash $USERNAME

id -u $USERNAME

此处,您将使用传递的ENV值。

答案 1 :(得分:1)

创建图像时执行useradd。如果要在启动容器时运行某些命令,请将它们放入在开始时执行的脚本中。