duankangpazhuo0347
2013-11-10 23:53 阅读 112

Docker echo环境变量

I'm trying to write a little docker file that sets a User and just echos the current user as a little example to prove to myself it is working. I've tried a number of variants and couldn't find much help in the documentation.

FROM ubuntu
USER daemon
# ENTRYPOINT ["echo", "$USER"]
# just gives "$USER"
# ENTRYPOINT ["echo", "-e", "${USER}"]
# just gives "$USER"
# ENTRYPOINT echo $USER
# gives empty string
# ENTRYPOINT ["/bin/echo", "$USER"]
# just gives "$USER"

I'm running docker build . on the dockerfile and then running docker run <image-id> and getting the results

Expected result is daemon, or without the USER daemon line, I expect root. Probably a really simple answer.

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • 已采纳
    dongzhuo0895 dongzhuo0895 2013-11-11 14:39

    This is the expected behavior, as weird as it seems!

    When ENTRYPOINT is a list (as in ENTRYPOINT ["echo", "$USER"]), it is used as-is, without further parsing or interpretation. So $USER remains $USER, because there is no shell involved in the process to replace it with the value of the USER environment variable.

    Now, when ENTRYPOINT is a string (as in ENTRYPOINT echo $USER), what is actually executed is sh -c "echo $USER", and $USER is replaced with the value of the environment variable (as you would expect).

    However, the environment variable USER is not set by default. It is set by the login process; and when you just run sh -c ... the login process is not involved.

    Compare the environment when running docker run -t -i ubuntu bash and docker run -t -i ubuntu login -f root. In the former case, you will get a very basic environment; in the latter case, you will get the complete environment that you are used to (including USERvariable).

    点赞 评论 复制链接分享
  • dongqie2355 dongqie2355 2013-11-11 13:11

    I think there´s a series of issues here.

    when I

    docker run -i -t ubuntu /bin/bash
    echo $USER
    set
    

    I don´t see $USER set at all - whoami does report daemon though.

    additionally, I have the suspicion (but have not looked at the code yet) that ENV vars in the Dockerfile are escaped, to avoid their use (many people assume that they can export host variables to the built container, but this is something that the docker guys would like to avoid)

    点赞 评论 复制链接分享
  • dtgv52982 dtgv52982 2014-09-11 08:45

    Couldn't you set, in the Dockerfile, the ENV command to a default value, and then, when run-ning a container, use the -e, --env dictionary to override what would be interpreted by the:

    ENTRYPOINT echo $SOMEENVVAR
    

    form of ENTRYPOINT?

    点赞 评论 复制链接分享

相关推荐