在构建过程中,我需要调用zipalign,它位于我正在使用的docker容器中的某个路径上:
$ docker run nathansamson/flutter-builder-docker:v0.7.3 find . -iname zipalign
./opt/android-sdk-linux/build-tools/28.0.1/zipalign如果docker容器更新了,并且有了新的android sdk,则可以更改此路径。例如,这可能是未来的路径:
$ docker run nathansamson/flutter-builder-docker:v0.9.9 find . -iname zipalign
./opt/android-sdk-linux/build-tools/42.0.0/zipalign因此,不是将调用硬编码到
docker run nathansamson/flutter-builder-docker:v0.7.3 \
/opt/android-sdk-linux/build-tools/28.0.1/zipalign -h 我想要一个通用的解决方案,找到路径的zipalign自动。我已经用一个子subshell尝试过了
$ docker run nathansamson/flutter-builder-docker:v0.7.3 $(find . -iname zipalign) -h
docker: Error response from daemon: OCI runtime create failed:
container_linux.go:348: starting container process caused "exec: \"-h\":
executable file not found in $PATH": unknown.
ERRO[0001] error waiting for container: context canceled 并对文件夹使用通配符:
$ docker run nathansamson/flutter-builder-docker:v0.7.3 /opt/android-sdk-linux/build-tools/*/zipalign -h
docker: Error response from daemon: OCI runtime create failed:
container_linux.go:348: starting container process caused "exec:
\"/opt/android-sdk-linux/build-tools/*/zipalign\": stat /opt/android-
sdk-linux/build-tools/*/zipalign: no such file or directory": unknown.
ERRO[0001] error waiting for container: context canceled 因此subshell和通配符在Docker中不起作用。当我调用zipalign的时候,你知道我怎么找到它的路径吗?
发布于 2018-09-12 09:26:11
在Dockerfile中,您可以控制整个环境。通常最简单的方法是让事物出现在它们“自然”的地方,比如/usr/bin。您还有一个优势,即在单个Docker映像中,将只安装一个版本的工具。
我可能会这样做:
RUN for f in $PWD/opt/android-sdk-linux/build-tools/*/*; do \
ln -s $f /usr/local/bin; \
done
CMD ["zipalign", "-h"]另一种可行的方法是使用build参数或环境变量来保存版本号。如果您这样做,那么您可以设置一个已知的路径名。
ARG version
RUN curl -LO http://.../android-sdk-linux-${version}.tar.gz \
&& tar xzf android-sdk-linux-${version}.tar.gz \
&& rm -f android-sdk-linux-${version}.tar.gz \
&& cd opt/android-sdk-linux-build-tools \
&& ln -s ${version} current
CMD ["./opt/android-sdk-linux/build-tools/current/zipalign"]发布于 2018-09-12 09:00:38
find可以通过使用-exec选项来执行某些操作。
find . -name zipalign -exec bash -c '"$0"' {} \;在您的示例中:
docker run nathansamson/flutter-builder-docker:v0.7.3 find . -name zipalign -exec bash -c '"$0"' {} \;发布于 2018-09-12 07:42:10
如果没有任何东西可以给你任何提示,而你只需要找到它,那么find可能会这么做。类似于:
find /opt -name zipalign -type f如果你可以给它更具体的起点,而不仅仅是/opt,那么它会运行得更快。
如果您想在一行中执行它(并传入"-h"),您可以这样做:
$(find /opt -name zipalign -type f) -hhttps://stackoverflow.com/questions/52285400
复制相似问题