我有一个Dockerfile,我试图在其中安装和使用asdf来管理Python包版本。下面显示了我的Dockerfile的一个片段。
SHELL ["/bin/bash", "-c"]
RUN git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.10.0
RUN chmod +x ~/.asdf/asdf.sh ~/.asdf/completions/asdf.bash
RUN echo ". $HOME/.asdf/asdf.sh" >> ~/.bashrc
RUN echo ". $HOME/.asdf/completions/asdf.bash" >> ~/.bashrc
ENV PATH="$HOME/.asdf/bin:$HOME/.asdf/shims:$PATH"
ENV PATH="$HOME/.asdf:$PATH"
RUN echo -e '\nsource $HOME/.asdf/asdf.sh' >> ~/.bashrc
RUN source ~/.bashrc
RUN bash -c 'echo -e which asdf'
RUN asdf plugin-add python最后一行是冒犯的台词。当我试图建立这个码头形象,我得到以下信息。
=> ERROR [17/19] RUN asdf plugin-add python 0.3s
------
> [17/19] RUN asdf plugin-add python:
#21 0.292 /bin/bash: asdf: command not found
------
executor failed running [/bin/bash -c asdf plugin-add python]: exit code: 127但是,如果删除该行,则可以运行容器,然后立即成功地运行asdf。
docker run -it <image ID>
root:# asdf plugin-add python
initializing plugin repository...Cloning into '/root/.asdf/repository'...
<etc>当我尝试在Dockerfile中运行它时,为什么这个方法不能工作呢?
发布于 2022-10-08 18:50:06
我发现source ~/.bashrc;并不总是在码头容器中这样做(有时在实时操作系统中也不是这样),/bin/bash -c 'source ~/.bashrc';也不是。
我发现,在构建时在Docker容器中安装asdf的诀窍是重新启动bash (即exec bash__)。这可能与这样一个事实有关,即我们实际上并不是在修改PATH=之类的东西,而是使用符合posix的源指令来用文件名来别名可执行脚本(减去它的扩展名)。
. $HOME/.asdf/asdf.sh
指:
source /home/user/.asdf/asdf.sh
它似乎产生了以下效果:
alias asdf=/home/user/.asdf/asdf.sh
简单地查找文件是行不通的,因为安装指令(由asdf作者提供)本质上提供了一个源指令,可以放置在~/.bashrc中,我相信上下文就变成了我们随后使用的shell中的上下文。
要解决这个问题,我们必须重新启动bash -没有其他方法了。
在尝试将用户包(实际上是语义)配置为root时,我们还会遇到许多怪癖和问题,因此最好是建立一个非根用户来处理。
下面是一个安装的工作示例:
FROM debian:bookworm-slim
# .. LABEL, etc., ...
#
RUN apt-get update && \
# prep tools also for asdf (last 2)
apt-get install -y curl git \
software-properties-common \
gnupg2 apt-transport-https \
# prep deps for asdf-ruby
build-essential autoconf \
bison patch rustc \
libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libgmp-dev \
libncurses5-dev libffi-dev libgdbm6 libgdbm-dev libdb-dev uuid-dev \
# prep deps for asdf-nodejs
dirmngr gawk \
# prep deps for non-root user
sudo; \
# create special user
useradd --create-home --shell /bin/bash gitlab; \
/bin/bash -c 'echo "gitlab:password" | chpasswd'; \
adduser gitlab sudo
## change user for all subsequent commands
USER gitlab
# change working directory
WORKDIR /home/gitlab
# install asdf
RUN \
# configure git to get rid of detached head warnings
git config --global advice.detachedHead false; \
git clone https://github.com/asdf-vm/asdf.git $HOME/.asdf --branch v0.10.2; \
/bin/bash -c 'echo -e "\n\n## Configure ASDF \n. $HOME/.asdf/asdf.sh" >> ~/.bashrc'; \
/bin/bash -c 'echo -e "\n\n## ASDF Bash Completion: \n. $HOME/.asdf/completions/asdf.bash" >> ~/.bashrc'; \
exec bash; \
# install asdf-ruby
/bin/bash -c asdf plugin add ruby https://github.com/asdf-vm/asdf-ruby.git; \
# install asdf-nodejs
/bin/bash -c asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git;
# whatever you now want to do -发布于 2022-04-29 21:16:45
这..。
RUN source ~/.bashrc绝对什么都不做。每个RUN命令在一个新的shell中执行,该shell在命令完成时退出。获取bash脚本、设置变量和其他修改当前环境的内容将不会持续到后续的RUN命令中。
您可以修改Dockerfile以在RUN命令中运行一系列命令,如下所示:
RUN source ~/.bashrc; \
asdf plugin-add python...which至少会成功地获取.bashrc文件,并可能使asdf工具可用。
https://stackoverflow.com/questions/72063324
复制相似问题