首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以在Docker容器内安装asdf,但不能通过Dockerfile在构建时安装

可以在Docker容器内安装asdf,但不能通过Dockerfile在构建时安装
EN

Stack Overflow用户
提问于 2022-04-29 20:22:57
回答 2查看 879关注 0票数 0

我有一个Dockerfile,我试图在其中安装和使用asdf来管理Python包版本。下面显示了我的Dockerfile的一个片段。

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

最后一行是冒犯的台词。当我试图建立这个码头形象,我得到以下信息。

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

代码语言:javascript
复制
docker run -it <image ID>
root:# asdf plugin-add python
initializing plugin repository...Cloning into '/root/.asdf/repository'...
<etc>

当我尝试在Dockerfile中运行它时,为什么这个方法不能工作呢?

EN

回答 2

Stack Overflow用户

发布于 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时,我们还会遇到许多怪癖和问题,因此最好是建立一个非根用户来处理。

下面是一个安装的工作示例:

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

Stack Overflow用户

发布于 2022-04-29 21:16:45

这..。

代码语言:javascript
复制
RUN source ~/.bashrc

绝对什么都不做。每个RUN命令在一个新的shell中执行,该shell在命令完成时退出。获取bash脚本、设置变量和其他修改当前环境的内容将不会持续到后续的RUN命令中。

您可以修改Dockerfile以在RUN命令中运行一系列命令,如下所示:

代码语言:javascript
复制
RUN source ~/.bashrc; \
  asdf plugin-add python

...which至少会成功地获取.bashrc文件,并可能使asdf工具可用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72063324

复制
相关文章

相似问题

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