Docker:如何将 bash 与基于 Alpine 的 docker 映像一起使用?

Posted

技术标签:

【中文标题】Docker:如何将 bash 与基于 Alpine 的 docker 映像一起使用?【英文标题】:Docker: How to use bash with an Alpine based docker image? 【发布时间】:2017-04-18 02:07:31 【问题描述】:

我从 openjdk:8-jdk-alpine 创建了一个 docker 映像,但是当我尝试执行简单的命令时出现以下错误:

RUN bash
/bin/sh: bash: not found

RUN ./gradlew build
env: can't execute 'bash': No such file or directory

【问题讨论】:

谷歌员工:docker run --rm -i -t alpine /bin/sh 启动容器(交互方式):docker exec -it container_id /bin/sh 【参考方案1】:

Alpine docker 镜像默认没有安装 bash。您需要添加以下命令来获取bash

RUN apk update && apk add bash

如果您使用的是Alpine 3.3+,那么您可以这样做:

RUN apk add --no-cache bash

保持 docker 图像尺寸较小。 (感谢@sprkysnrky 的评论)

【讨论】:

apk upgrade 不是必需的。 我更喜欢使用@Yuva 的推荐,使用RUN /bin/sh 而不是RUN bin/bash 这完全取决于你,很多人需要bash 特定功能。 我为什么要使用--no-cache 选项?【参考方案2】:

尝试使用RUN /bin/sh 代替 bash。

【讨论】:

OP 要求 bash。 sh 不是 bash。 但无论如何,这是非常有用的评论 - 大多数人都可以使用 sh - 而且它不需要额外 50mb 的图像大小 简单明了。大多数时候我们只需要运行糟糕的命令(ls、ps 等等),sh 涵盖了这些场景。谢谢! @kboom bash 包的大小比alpine:3.8 增加了大约 4MB,大约翻了一番,但距离 50MB 还很远。 这应该是评论而不是答案。同时,我同意接受的答案应该包含一条评论,如果可能的话,应该坚持使用sh,而不是安装bash,因为它会增加图像的大小。【参考方案3】:
RUN /bin/sh -c "apk add --no-cache bash"

为我工作。

【讨论】:

RUN 命令的开头部分是不必要的。你可以直接写RUN apk add --no-cache bash【参考方案4】:

要安装 bash,你可以这样做:

RUN apk add --update bash && rm -rf /var/cache/apk/*

如果您不想为图像添加额外尺寸,可以使用 alpine 附带的 ashsh

参考:https://github.com/smebberson/docker-alpine/issues/43

【讨论】:

以上是关于Docker:如何将 bash 与基于 Alpine 的 docker 映像一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

干货~powershell与bash和docker在项目中怎么用

如何通过 docker 将 API 与 Web SPA 连接起来

基于docker安装superset

如何在没有注销/登录的情况下将用户添加到组 - Bash 脚本

如何在启动 git bash 终端之前运行 linux 命令

使用scratch构建最小化Go程序的docker image