当向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"
如果需要其他细节,请告诉我。先谢谢你。
这里的路径是 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
.
你应该在创建容器或服务时设置变量。
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
该 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
环境变量,而不是将其作为参数传递。