【问题标题】:How to create a docker image for shell scripts suite如何为 shell 脚本套件创建 docker 映像
【发布时间】:2020-11-07 14:16:34
【问题描述】:

我想为 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

【问题讨论】:

  • 您遇到的具体问题是什么?似乎您需要将“我的命令”脚本中的大部分内容移动到入口点脚本中;我可能会将您尝试运行的命令作为命令部分而不是环境变量传递。
  • 当我运行 docker 镜像时,我得到了 demuxbyname.sh not found 的错误。我不确定我的 docker 文件中缺少什么。
  • 你在哪里添加了 SHELLTOOL 和其余环境变量定义的块?
  • @emi 在命令中:export SHELLTOOL="/usr/local/bbmap/demuxbyname.sh";
  • 我的意思是,在 Docker 环境中。

标签: linux docker shell


【解决方案1】:

您可以通过多种方式将所有这些环境变量添加到已执行的容器中。我将使用普通的 Docker 和 DockerCompose 解决方案。这取决于您的需求,哪一个更适合您。无论您采用哪种选择,都有几个我没有见过的变量:PRFULLSM。您可能希望将它们添加到变量定义块的顶部。

普通 Docker

您需要在执行entrypoint.sh 之前定义这些变量。您可以在构建时或运行时添加它们。要在构建时添加它们,您需要修改 Dockerfile。即使使用默认值,您也可以对其进行硬编码或参数化:

硬编码

如果这个变量永远不会改变,这个选项很好,永远不会改变。只需将环境变量添加到 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}"

码头工人撰写

使用此工具,您可以在构建时或运行时使用声明性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...

与构建 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...

【讨论】:

    猜你喜欢
    • 2019-04-09
    • 2021-12-14
    • 1970-01-01
    • 2017-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    相关资源
    最近更新 更多