gpt4 book ai didi

linux - 如何为Shell脚本套件创建Docker镜像

转载 作者:行者123 更新时间:2023-12-03 10:00:16 25 4
gpt4 key购买 nike

我想为BBmap套件创建一个docker镜像,该镜像具有一个包含多个shell脚本(${SHELLTOOLS})的文件夹。我在下面创建了一个docker文件来创建docker镜像,但是我也想使用帮助脚本entrypoint.sh。如何使此docker文件与entrypoint.sh一起运行?有人可以建议我向此docker文件和entrypoint.sh添加/更改什么,以便我可以创建docker镜像并使用以下命令运行它吗?
我的Docker文件:

FROM openjdk:8-jre
RUN apt-get update \
&& apt-get install -y \
build-essential \
openjdk-11-jre \
wget \
&& rm -rf /var/lib/apt/lists/*

ENV BBMAP_VERSION 38.20
ENV BBMAP_DIR /usr/local/bbmap

WORKDIR /usr/local
RUN set -eux; \
wget -O bbmap.tar.gz https://sourceforge.net/projects/bbmap/files/BBMap_${BBMAP_VERSION}.tar.gz/download \
&& tar -zxf bbmap.tar.gz \
&& rm bbmap.tar.gz

ENV PATH ${BBMAP_DIR}:${PATH}
COPY ./entrypoint.sh /usr/local/bin/
## Add ENV for Shell scripts from BBMAP
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
我的 entrypoint.sh:
#!/bin/bash
${SHELLTOOL} -Xmx${MEM}g in=${sortedFQ} delimiter=${DELIM} prefixmode=f column=${COLNUM} out=${sampleFQ}%_#.fq
我的命令在LSF服务器上运行:
export SHELLTOOL="/usr/local/bbmap/demuxbyname.sh"; \
export MEM=20; \
export sortedFQ="/${PR}/${FULLSM}/paire_test_sorted.fastq"; \
export column=2; \
export DELIM=":"; \
export COLNUM=2; \
export sampleFQ="/${PR}/${FULLSM}/ADNI_1380"
bsub \
-J "${FULLSM}_bbduk_demulti" \
-o "${BASE}/${FULLSM}_bbduk_demulti.%J" \
-n1 -W 1440 \
-R "rusage[mem=20192]" \
-q research-hpc \
-a "docker(username/bbmap:latest)" \
entrypoint.sh

最佳答案

您可以通过多种方式将所有这些env var添加到执行的容器中。我将使用普通的Docker和DockerCompose解决方案。这取决于您的需求,哪个更适合您。无论采用哪种选择,都有几个我从未见过的变量:PRFULLSM。您可能需要将它们添加到变量定义块的顶部。
普通Docker
您需要在执行entrypoint.sh之前定义这些变量。您可以在构建时或运行时添加它们。要在构建时添加它们,您需要修改Dockerfile。您可以对其进行硬编码或参数化,即使使用默认值也可以:
硬编码
如果此变量永不更改,并且永不更改,则此选项很好。只需将env vars添加到Dockerfile as seen in the docs中:

# Only one ENV to add only one extra layer
ENV \
SHELLTOOL="/usr/local/bbmap/demuxbyname.sh" \
MEM=20 \
sortedFQ="/${PR}/${FULLSM}/paire_test_sorted.fastq" \
column=2 \
DELIM=":" \
COLNUM=2 \
sampleFQ="/${PR}/${FULLSM}/ADNI_1380"
最后,重建您的Docker容器并运行它。它应该工作。
参数化
这样,您就可以使用 build选项通过 arg命令更改值。如果这些变量几乎总是相同,但是可以从一种环境更改为另一种环境,或者将来可能会更改,因为它们过去已经更改过,那么这很好。此外,我们将为它们设置默认值,因此构建它的工作几乎与第一个选项相同:
ARG SHELLTOOL=/usr/local/bbmap/demuxbyname.sh
ARG MEM=20
ARG sortedFQ=/${PR}/${FULLSM}/paire_test_sorted.fastq
ARG column=2
ARG DELIM=:
ARG COLNUM=2
ARG sampleFQ=/${PR}/${FULLSM}/ADNI_1380

ENV \
SHELLTOOL="${SHELLTOOL}" \
MEM=${MEM} \
sortedFQ="${sortedFQ}" \
column=${column} \
DELIM="${DELIM}" \
COLNUM=${COLNUM} \
sampleFQ="${sampleFQ}"
docker 组成
使用此工具,您可以使用声明性 yaml格式定义在构建时或运行时与容器一起使用的变量。如果要在构建期间定义它们,则还需要使用上面说明的参数化选项,以允许docker-compose使用它们。
建立时间
docker-compose具有定义构建参数的选项:
version: "3"
services:

bbmap:
build:
context: .
args:
- SHELLTOOL=/usr/local/bbmap/demuxbyname.sh
- MEM=20
# etc...
您甚至可以包含一个 .env文件,并从 yaml中使用它: .env:
SHELLTOOL="/usr/local/bbmap/demuxbyname.sh"
MEM=20
sortedFQ="/${PR}/${FULLSM}/paire_test_sorted.fastq"
column=2
DELIM=":"
COLNUM=2
sampleFQ="/${PR}/${FULLSM}/ADNI_1380"
docker-compose.yml:
version: "3"
services:

bbmap:
build:
context: .
args:
- SHELLTOOL=${SHELLTOOL}
- MEM=${MEM}
# etc...
运行
docker-compose有一个定义环境变量的选项:
version: "3"
services:

bbmap:
build:
context: .
environment:
- SHELLTOOL=/usr/local/bbmap/demuxbyname.sh
- MEM=20
# etc...
与build args选项一样,您可以使用 .env文件包括它们: .env:
SHELLTOOL="/usr/local/bbmap/demuxbyname.sh"
MEM=20
# etc...
docker-compose.yml:
version: "3"
services:

bbmap:
build:
context: .
environment:
- SHELLTOOL=${SHELLTOOL}
- MEM=${MEM}
# etc...

关于linux - 如何为Shell脚本套件创建Docker镜像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64728592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com