我想从 ubuntu 镜像构建一个 docker 镜像。需要手动将默认 sh 从 dash 更改为 bash。(因为它需要安装许多包含 bash 脚本的 rpm 包)
dpkg-reconfigure dash
有没有什么方法可以让这个动作自动进行而无需人工操作?
在我的 Dockerfile 中它可能写为(方法 1)
RUN dpkg-reconfigure dash
我尝试了另一种方法(方法 2)
RUN ln -sf bash /bin/sh
但,这两种方法都行不通。
答案1
你可以让 debconf 只询问高级或关键的问题[1]。
前任:
dpkg-reconfigure -p critical dash
dpkg-reconfigure 会使用 debconf 脚本中定义的默认答案。你也可以使用 debconf-get-selections 为非交互式安装选择不同的答案[2]。
答案2
将 Daniel 的评论粘贴在这里作为答案,因为它不依赖于 的默认设置dpkg-reconfigure
。
获取选项:
debconf-show dash
要将此特定选项设置为false
:
echo "dash dash/sh boolean false" | debconf-set-selections
并实际重新配置包:
DEBIAN_FRONTEND=noninteractive dpkg-reconfigure dash
这对我来说在 Dockerfile 中是有效的:
# make /bin/sh symlink to bash instead of dash:
RUN echo "dash dash/sh boolean false" | debconf-set-selections
RUN DEBIAN_FRONTEND=noninteractive dpkg-reconfigure dash
答案3
通过反复试验和其他人的帮助下,这个 ansible 语句做了同样的事情:
# See "/var/cache/debconf/config.dat" for name of config item after changing manually
- name: aws-ssm ansible plugin fails if dash is the default shell
ansible.builtin.debconf:
name: dash/sh
question: dash/sh
value: false
vtype: boolean
答案4
您应该修补这些脚本以使用#!/bin/bash
而不是#!/bin/sh
。较新版本的 Debian 和 Ubuntu 不再支持使用除 dash 之外的任何其他内容/bin/sh
。