如何解决如何将未知的环境变量列表传递给Dockerfile中的命令
我有一个很长且经常更改的环境变量列表,启动时需要将其传递给相同的Docker映像。这些环境变量是在Rancher环境中配置的,因此将单独传递。它们都应该传递给即将在映像中启动的命令。
当我只有几个参数时,可以在Dockerfile中显式声明它们时传递它们:
$zk = new ZKLib($this->machineIP,4370);
$ret = $zk->connect();
sleep(1);
if ( $ret ):
$zk->disableDevice();
sleep(1);
$attendance = $zk->getAttendance();
endif;
$zk->enableDevice();
sleep(1);
$zk->disconnect();
现在这不可能了,因为该列表已经发展到很远,并且动态变化很大。我也无法为每个用例建立新的映像。
我需要类似的东西:
CMD [ "sh","-c","node src/server.js --param1=$ENV_PARAM_1" --param2=$ENV_PARAM_2 ... --paramN=$ENV_PARAM_N"" ]
侧面说明:当提供命令未知的命令参数时,该命令将失败。
知道我该如何解决吗?
解决方法
运行容器时,您可以覆盖CMD
。假设您使用默认命令构建了一个图片
CMD node src/server.js
当您实际运行容器时,可以使用所需的任何内容覆盖它
docker run \
-d -p ... \
my/image \
node src/server.js --param1=$ENV_PARAM_1 --param2=$ENV_PARAM_2 ...
正如我在此处所写的,$ENV_PARAM_N
将由主机系统的外壳程序解决,但是如果有工具正在为您启动容器,那可能不是问题。如果某些值来自Dockerfile ENV
指令,则需要强制容器外壳进行扩展
docker run \
-d -p ... \
-e ENV_PARAM_2=not-in-the-dockerfile \
my/image \
sh -c 'node src/server.js --param1=$ENV_PARAM_1 --param2=$ENV_PARAM_2 ...'
还有pattern,使用ENTRYPOINT
作为要运行的主程序,而仅将CMD
用于其他选项。
ENTRYPOINT ["node","src/server.js"]
CMD []
docker run \
-d -p ... \
my/image \
--param1=$ENV_PARAM_1 --param2=$ENV_PARAM_2 ...
但是,请注意,在这种情况下,您不能要求容器外壳为您扩展东西。 ENTRYPOINT
必须使用JSON数组语法,并且您不能在此命令中的任何地方插入sh -c
很有用。 (sh -c command
仅使用一个shell“ word”作为其命令,此后编写的任何其他选项通常都会被忽略。)
您可以使用ENTRYPOINT来定义启动容器时应始终存在的部件,以及使用CMD来定义在容器启动时被命令覆盖的部件:
ENTRYPOINT [ "sh","-c","node src/server.js"]
CMD ["--param1=$ENV_PARAM_1","--param2=$ENV_PARAM_2",... "--paramN=$ENV_PARAM_N"]
这样,您可以为每次运行使用不同的参数:
docker run server # Executes ENTRYPOINT + CMD from Dockerfile
docker run server --help # Executes ENTRYPOINT + "--help"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。