Docker:如何在Docker文件中向ENTRYPOINT添加变量?

问题描述 投票:0回答:1

当向docker添加一个变量时 ENTRYPOINT,docker构建成功。但是当运行docker镜像时,我得到以下错误信息

$> sudo docker run f7edbecba608 .

   .: 1: .: [/usr/lib/dart/bin,: not found

然而,当变量不放在dockerfile中时,能够成功地构建和运行镜像。

在docker文件中放置变量和不放置变量的区别是什么?ENTRYPOINT.

下面是我的 Dockerfile

FROM google/dart

WORKDIR /sample_dir

ADD . /sample_dir

WORKDIR /sample_dir/project

RUN pub get

ARG REDIS_HOST

ENV MY_ENV = $REDIS_HOST

ENTRYPOINT ["/usr/lib/dart/bin", "./bin/main.dart", $REDIS_HOST]

用于建立图像的命令。

sudo docker build --build-arg "REDIS_HOST=127.0.0.1" 

如果需要其他细节,请告诉我。先谢谢你。

docker dockerfile
1个回答
0
投票

这里的路径是 dart 是问题所在。正确的路径应该是 /usr/bin/dart - 官方裁判。

你可以更新 ENTRYPOINT 到以下几点。

FROM google/dart

WORKDIR /sample_dir

ADD . /sample_dir

WORKDIR /sample_dir/project

RUN pub get

ARG REDIS_HOST

ENV MY_ENV = $REDIS_HOST

ENTRYPOINT ["/usr/bin/dart", "./bin/main.dart", $REDIS_HOST]

假设你 main.dart 存于 /sample_dir/project/bin/main.dart 根据您的 Dockerfile.


0
投票

你应该在创建容器或服务时设置变量。

docker run -e REDIS_HOST=127.0.0.1

而用

Map<String, String> envVars = Platform.environment;
print(envVars['REDIS_HOST']);

或者您可以定义主机名

docker run --add-host redis_host=127.0.0.1

而你可以测试 ping redis_host


0
投票

ENTRYPOINT 必须是一个有效的JSON数组,或者被解释为一个字符串。 在你的例子中,变量 $REDIS_HOST 不是一个加引号的JSON字符串,所以这被解释为shell形式,实际上你得到的是

ENTRYPOINT sh -c '["/usr/bin/dart", "./bin/main.dart", $REDIS_HOST]'

这直接导致了你所得到的错误(该命令在处理双引号后的第一个字是 [/usr/bin/dart, 而这不是一个有效的命令)。)

如果你需要包含环境变量扩展之类的东西,你必须使用这些命令的shell形式,而不是JSON数组形式。

CMD /usr/bin/dart ./bin/main.dart $REDIS_HOST

就像@GigaKokaia在 其答案 你可能希望这个变量是运行时的环境变量,而不是构建时的参数(你不希望每次部署到不同的环境时都要重建镜像;集群和云设置会有不同的主机名),但有了这种形式,你就会发现 $REDIS_HOST 才会被评估 docker run -e 环境变量设置被处理。 你也可以让你的应用程序直接寻找到的 $REDIS_HOST 环境变量,而不是将其作为参数传递。

© www.soinside.com 2019 - 2024. All rights reserved.