我正在尝试使用 R 2.5.0(我知道这很旧)和 affyPara 包(也很旧)构建一个 docker 映像。 Bioconductor 版本 2.7 应支持 affyPara,该版本应在 Ubuntu 16.04 上运行。因此,我一直在研究这个 dockerfile:
FROM ubuntu:16.04
ENV TZ UTC
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
&& echo $TZ > /etc/timezone \
&& sed -Ei 's/^# deb-src /deb-src /' /etc/apt/sources.list \
&& apt-get update -qq \
&& apt-get build-dep r-base-dev -y \
&& apt-get install wget locales -y
RUN echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen \
&& locale-gen en_US.utf8 \
&& /usr/sbin/update-locale LANG=en_US.UTF-8
ENV LC_ALL en_US.UTF-8
ENV LANG en_US.UTF-8
RUN wget https://cran.r-project.org/src/base/R-2/R-2.5.0.tar.gz \
&& tar -xf R-2.5.0.tar.gz \
&& cd R-2.5.0 \
&& ./configure --without-x ; make \
&& make install
# Install Bioconductor version 2.7
RUN R -e 'install.packages("BiocManager", repos="https://cran.r-project.org")'
RUN R -e 'BiocManager::install(version = "2.7")'
# Install affyPara from Bioconductor version 2.7
RUN R -e 'BiocManager::install("affyPara", version = "2.7")'
CMD ["R"]
当我尝试使用以下命令构建此映像(在 docker 文件的目录中)时:
sudo docker buildx build -t affypara -f affyPara.dockerfile .
我收到此错误:
[+] Building 61.1s (5/10) docker:default
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from affyPara.dockerfile 0.0s
=> => transferring dockerfile: 1.01kB 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:16.04 0.4s
=> CACHED [1/7] FROM docker.io/library/ubuntu:16.04@sha256:1f1a2d56de1d604801a9671f301190704c25d604a416f59e03c04f5c6ffee0d6 0.0s
=> ERROR [2/7] RUN ln -snf /usr/share/zoneinfo/UTC /etc/localtime && echo UTC > /etc/timezone && sed -Ei 's/^# deb-src /deb-src /' /etc/apt/sources.list && apt-get update -qq && apt-get build-dep r-base-dev -y 60.5s
------
> [2/7] RUN ln -snf /usr/share/zoneinfo/UTC /etc/localtime && echo UTC > /etc/timezone && sed -Ei 's/^# deb-src /deb-src /' /etc/apt/sources.list && apt-get update -qq && apt-get build-dep r-base-dev -y && apt-get install wget locales -y:
60.43 W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial/InRelease Temporary failure resolving 'archive.ubuntu.com'
60.43 W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-updates/InRelease Temporary failure resolving 'archive.ubuntu.com'
60.43 W: Failed to fetch http://archive.ubuntu.com/ubuntu/dists/xenial-backports/InRelease Temporary failure resolving 'archive.ubuntu.com'
60.43 W: Failed to fetch http://archive.canonical.com/ubuntu/dists/xenial/InRelease Temporary failure resolving 'archive.canonical.com'
60.43 W: Failed to fetch http://security.ubuntu.com/ubuntu/dists/xenial-security/InRelease Temporary failure resolving 'security.ubuntu.com'
60.43 W: Some index files failed to download. They have been ignored, or old ones used instead.
60.44 Reading package lists...
60.45 E: You must put some 'source' URIs in your sources.list
------
affyPara.dockerfile:4
--------------------
3 |
4 | >>> RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
5 | >>> && echo $TZ > /etc/timezone \
6 | >>> && sed -Ei 's/^# deb-src /deb-src /' /etc/apt/sources.list \
7 | >>> && apt-get update -qq \
8 | >>> && apt-get build-dep r-base-dev -y \
9 | >>> && apt-get install wget locales -y
10 |
--------------------
ERROR: failed to solve: process "/bin/sh -c ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && sed -Ei 's/^# deb-src /deb-src /' /etc/apt/sources.list && apt-get update -qq && apt-get build-dep r-base-dev -y && apt-get install wget locales -y" did not complete successfully: exit code: 100
不应该通过sed命令将源添加到sources.list中吗?主机可以访问互联网,所以我确信这不是问题。我应该注意我要离开这篇博文:https://chainsawriot.com/postmannheim/2023/01/30/oldestr.html.
我非常感谢有关此问题的任何帮助。我的实验室需要在项目中使用 affyPara,不幸的是它不适用于现代版本的 R 或 BioConductor。
显示的错误表明 Docker 构建过程中存在网络问题。它显示“Temporary failure resolving 'archive.ubuntu.com”,这表明 Docker 在解析该 URI 的 DNS 时遇到问题。
以下是解决此问题的几个步骤:
如果您在 VPN 或代理后面工作,请尝试暂时禁用它并重建 Docker 映像,它可能会影响 DNS 解析。
或者,您可以直接在 Docker 守护程序设置中添加 DNS 服务器(例如 Google 的
8.8.8.8
)。如果您使用的是 Unix 系统,则可以将此行添加到您的 /etc/docker/daemon.json
文件中,如果不存在则创建它:
{ “DNS”:[“8.8.8.8”] }
然后,重新启动 Docker 守护进程:
sudo service docker restart
但是,如果所有网络问题都已解决但仍然失败,我们可以尝试使用 Rocker 旧映像安装 R 2.5.1 和 Bioconductor 2.7 版的不同方法。
首先,尝试用
rocker/r-ubuntu:16.04
替换基础图像,使用FROM rocker/r-ubuntu:16.04
。这是一个已安装 r-base 和 r-base-devel 的 Ubuntu 16.04 映像。您可以在here验证包含的软件包,并相应地修改您的Dockerfile。
然后,使用旧方法(而不是 BiocManager)手动安装 Bioconductor 2.7 版和 affyPara:
# Install Bioconductor version 2.7
RUN R -e 'source("https://bioconductor.org/biocLite.R"); biocLite()'
# Install affyPara from Bioconductor version 2.7
RUN R -e 'source("https://bioconductor.org/biocLite.R"); biocLite("affyPara")'
请记住,这些只是尝试的建议。由于软件依赖项和其他因素随着时间的推移而发生变化,为旧软件版本构建 Docker 映像可能具有挑战性。