首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Docker中的Subshell命令

Docker中的Subshell命令
EN

Stack Overflow用户
提问于 2018-09-12 07:25:10
回答 3查看 1.5K关注 0票数 1

在构建过程中,我需要调用zipalign,它位于我正在使用的docker容器中的某个路径上:

代码语言:javascript
复制
$ 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,则可以更改此路径。例如,这可能是未来的路径:

代码语言:javascript
复制
$ docker run nathansamson/flutter-builder-docker:v0.9.9 find . -iname zipalign
./opt/android-sdk-linux/build-tools/42.0.0/zipalign

因此,不是将调用硬编码到

代码语言:javascript
复制
docker run nathansamson/flutter-builder-docker:v0.7.3 \
/opt/android-sdk-linux/build-tools/28.0.1/zipalign -h 

我想要一个通用的解决方案,找到路径的zipalign自动。我已经用一个子subshell尝试过了

代码语言:javascript
复制
$ 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 

并对文件夹使用通配符:

代码语言:javascript
复制
$ 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的时候,你知道我怎么找到它的路径吗?

EN

回答 3

Stack Overflow用户

发布于 2018-09-12 09:26:11

在Dockerfile中,您可以控制整个环境。通常最简单的方法是让事物出现在它们“自然”的地方,比如/usr/bin。您还有一个优势,即在单个Docker映像中,将只安装一个版本的工具。

我可能会这样做:

代码语言:javascript
复制
RUN for f in $PWD/opt/android-sdk-linux/build-tools/*/*; do \
      ln -s $f /usr/local/bin; \
    done
CMD ["zipalign", "-h"]

另一种可行的方法是使用build参数或环境变量来保存版本号。如果您这样做,那么您可以设置一个已知的路径名。

代码语言:javascript
复制
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"]
票数 2
EN

Stack Overflow用户

发布于 2018-09-12 09:00:38

find可以通过使用-exec选项来执行某些操作。

代码语言:javascript
复制
find . -name zipalign -exec bash -c '"$0"' {} \;

在您的示例中:

代码语言:javascript
复制
docker run nathansamson/flutter-builder-docker:v0.7.3 find . -name zipalign -exec bash -c '"$0"' {} \;
票数 1
EN

Stack Overflow用户

发布于 2018-09-12 07:42:10

如果没有任何东西可以给你任何提示,而你只需要找到它,那么find可能会这么做。类似于:

代码语言:javascript
复制
find /opt -name zipalign -type f

如果你可以给它更具体的起点,而不仅仅是/opt,那么它会运行得更快。

如果您想在一行中执行它(并传入"-h"),您可以这样做:

代码语言:javascript
复制
$(find /opt -name zipalign -type f) -h
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52285400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档