我在一个容器中使用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
传递命令行。有什么建议吗?
2条答案
按热度按时间6qfn3psc1#
答案是用“壳”的形式
Docker将其转换为“数组”形式
shell用$0和$@替换command_string后面出现的参数,这些参数是Dockerfile CMD数组的内容(或者传递给
docker run
的参数,它将覆盖此数组)。有关完整说明,请参见https://stackoverflow.com/a/75063327/232452。
o7jaxewo2#
使用
使传递的参数追加到列表中,例如,如果传递
a b c
,则它变为由于
-c
需要单个参数,因此未按预期使用试用参数。相反,你必须使用docker的shell语法
ENTRYPOINT /bin/bash ...
,下面是一个简单的例子:可以通过
这产生预期输出