shell Docker build看不到现有的bash脚本,无法运行

1tuwyuhd  于 12个月前  发布在  Shell
关注(0)|答案(2)|浏览(136)

我正在尝试为一个名为DECoN(versin 2.0.0)的工具构建一个Docker容器。为此,我正在执行以下步骤:
1.启动FROM最新的bash镜像

  1. RUN下载该工具的源代码并将其解压缩
    1.将WORKDIR设置为工具的./Linux
  2. RUN在Linux操作系统中找到的 * 现有 * setup.sh脚本。
# syntax=docker/dockerfile:1

# start from a bash image 
FROM bash:latest

# download files 
RUN wget https://github.com/RahmanTeam/DECoN/archive/refs/tags/v2.0.0.tar.gz && \
    tar -xf v2.0.0.tar.gz

# go to directory 
WORKDIR DECoN-2.0.0/Linux

# run setup script 
RUN setup.sh

# check directory content 
RUN ls

您可以看到最后一个RUN ls的脚本的存在。但是,没有找到该脚本,并且docker build返回以下错误:

docker build -t decon:2.0.0 .

...

/bin/sh: setup.sh: not found
The command '/bin/sh -c setup.sh' returned a non-zero code: 127

你知道我哪里做错了吗?我不明白为什么找不到剧本。我试过setup.sh./setup.sh/DECoN-2.0.0/Linux/setup.sh,但没有工作。
编辑#1:这是bash脚本的内容:

#!/bin/bash

Rscript sessionInfo.R > setup.log 2>&1
pprl5pva

pprl5pva1#

要调试此类问题,请运行基本映像并在提示符下手动执行Dockerfile的命令:

docker run -it --rm bash:latest
wget https://github.com/RahmanTeam/DECoN/archive/refs/tags/v2.0.0.tar.gz
tar -xf v2.0.0.tar.gz
cd DECoN-2.0.0/Linux
./setup.sh

最后一行失败是因为,正如您所注意到的,它运行的Rscript在您的(非常小的)基础映像中不存在。Rscript属于R语言,所以我再次尝试使用official R base image

docker run -it --rm r-base:latest bash
wget https://github.com/RahmanTeam/DECoN/archive/refs/tags/v2.0.0.tar.gz
tar -xf v2.0.0.tar.gz
cd DECoN-2.0.0/Linux
./setup.sh

这一次,脚本运行并创建以下setup.log

# Bootstrapping renv 0.15.4 --------------------------------------------------
* Downloading renv 0.15.4 ... OK
* Installing renv 0.15.4 ... Done!
* Successfully installed and loaded renv 0.15.4.
Error: package 'BiocManager' is not available
In addition: Warning messages:
1: This project is configured to use R version '4.2.0', but '4.3.1' is currently being used.
2: could not retrieve available packages for url 'https://cran.ma.imperial.ac.uk/src/contrib'
Traceback (most recent calls last):
20: source("renv/activate.R")
19: withVisible(eval(ei, envir))
18: eval(ei, envir)
17: eval(ei, envir)
16: local(...)
15: eval.parent(substitute(eval(quote(expr), envir)))
14: eval(expr, p)
13: eval(expr, p)
12: eval(quote(...), new.env())
11: eval(quote(...), new.env())
10: renv::load()
 9: renv_load_bioconductor(project, lockfile$Bioconductor)
 8: renv_bioconductor_init()
 7: renv_bioconductor_init_biocmanager()
 6: install("BiocManager")
 5: retrieve(names(remotes))
 4: handler(package, renv_retrieve_impl(package))
 3: renv_retrieve_impl(package)
 2: stopf("package '%s' is not available", package)
 1: stop(sprintf(fmt, ...), call. = call.)
Execution halted

关于错误的R版本的警告可以通过使用r-base:4.2.0而不是r-base:latest来避免(建议安全),但错误消息package 'BiocManager' is not available仍然存在。
日志中引用的URL仍然有效,BiocManager是必须安装在R中的包。由于我不是R语言的Maven,我在这里停止我的分析,希望它能有所帮助。

**更新:**在Docker Hub中搜索,我发现了一些现成的镜像在Dockerfile中引用了RahmanTeam/DECoN

这一个显式安装BiocManager

其他图像可能存在。

sf6xfgos

sf6xfgos2#

  1. RUN ./setup.sh是在当前WORKPERT中运行shell脚本的正确方法。如果脚本在路径上,则只能使用RUN setup.sh
  2. ls -al将确认文件是否具有相应用户的r-x权限。否则,您将需要RUN chmod +x setup.sh来确保它可以执行。
    1.由于您使用的是bash:latest,因此脚本不太可能引用一个不存在的shell,但是如果.sh文件的第一行引用了一个不存在的shell,它将返回一个错误。如果#!/bin/ash,则确保ash实际存在。
    1.同样,由于您是在容器中下载和解压缩,这是不可能的,但如果zip文件已在Windows计算机上处理,则.sh文件中可能有CRLF行结尾。由于Linux只识别LF,这意味着它将#!/bin/bash<CR><LF>处理为执行不存在的shell /bin/bash<CR>的指令。下载文件并在编辑器(VSCode)中检查它,它可以告诉您结束样式。

相关问题