docker 停靠文件:ENTRYPOINT未扩展ARG/ENV变量

h5qlskok  于 2023-01-25  发布在  Docker
关注(0)|答案(2)|浏览(199)

我在一个容器中使用CentOS.7(因为我必须这样做),需要安装一些RedHat Software Collection软件包来升级几个工具。这涉及到运行source scl_source enable <package>来设置环境,我正在使用ENTRYPOINT脚本来完成。以下是我的Dockerfile中的内容,它可以工作...

ENV ENTRYPOINT="/usr/bin/entrypoint.sh"
RUN echo "#!/bin/bash" > ${ENTRYPOINT}; \
    chmod +x ${ENTRYPOINT}

# we need later Git for Visual Studio Code
RUN yum -y install rh-git227; \
    echo "source scl_source enable rh-git227" >> ${ENTRYPOINT}

# we need later python for Visual Studio Code
RUN yum -y install rh-python38-python-devel; \
    echo "source scl_source enable rh-python38" >> ${ENTRYPOINT}

# finish off the extrypoint script to run whatever needs running
RUN echo 'env|sort' >> ${ENTRYPOINT}; \
    echo 'echo ARGV="$@"' >> ${ENTRYPOINT}; \
    echo 'exec "$@"' >> ${ENTRYPOINT}
ENTRYPOINT [ "/usr/bin/entrypoint.sh" ]

当我使用docker run -it container /bin/bash --login启动容器时,entrypoint.sh脚本运行,并传递给原始命令行(/bin/bash --login)。
然而,我不得不在ENTRYPOINT命令中重复脚本名称,但即使我在定义中将ENV更改为ARG,做一些像ENTRYPOINT [ ${ENTRYPOINT} ]这样“明显”的事情也不起作用。在我看来,Docker需要ENTRYPOINT [...]中的文字字符串。
我也试过使用ENV的ENTRYPOINT [ "/bin/sh", "-c", ${ENTRYPOINT} ],但是使用这个表单不能从docker run传递命令行。有什么建议吗?

6qfn3psc

6qfn3psc1#

答案是用“壳”的形式

ENTRYPOINT ${ENTRYPOINT} "$0" "$@"

Docker将其转换为“数组”形式

ENTRYPOINT [ "/bin/sh", "-c", "${ENTRYPOINT} \"$0\" \"$@\"" ]

shell用$0和$@替换command_string后面出现的参数,这些参数是Dockerfile CMD数组的内容(或者传递给docker run的参数,它将覆盖此数组)。
有关完整说明,请参见https://stackoverflow.com/a/75063327/232452

o7jaxewo

o7jaxewo2#

使用

ENTRYPOINT [ "/bin/sh", "-c", ${ENTRYPOINT} ]

使传递的参数追加到列表中,例如,如果传递a b c,则它变为

ENTRYPOINT [ "/bin/sh", "-c", ${ENTRYPOINT}, a, b, c ]

由于-c需要单个参数,因此未按预期使用试用参数。
相反,你必须使用docker的shell语法ENTRYPOINT /bin/bash ...,下面是一个简单的例子:

FROM ubuntu:22.04

ENV ENTRY="/usr/bin/entry.sh"
RUN echo "#!/usr/bin/sh\necho Args: \$@" > ${ENTRY}; \
    chmod +x ${ENTRY}

ENTRYPOINT /usr/bin/sh ${ENTRY} "$0" "$@"

可以通过

docker build -t test .  && docker run --rm -it test a b c

这产生预期输出

Args: a b c

相关问题