我如何在Dockerfile中使用几行命令,以便在生成的图像中创建文件



我遵循RedhawkSDR的安装说明,它依赖于Centos7操作系统。由于我的机器使用的是Ubuntu 22.04,所以我创建了一个Docker容器来运行Centos7,然后在其中安装RedhawkSDR。

RedhawkSDR的一个安装说明是用以下命令创建一个文件:

cat<<EOF|sed 's@LDIR@'`pwd`'@g'|sudo tee /etc/yum.repos.d/redhawk.repo
[redhawk]
name=REDHAWK Repository
baseurl=file://LDIR/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhawk
EOF

我如何得到一个Dockerfile来执行这个命令时创建一个图像?

(另外,虽然我可以看到这个命令创建了文件/etc/yum.repos.d/redhawk.repo,它由从[redhawk]到gpgkey=....的行组成我不知道如何解析这个命令,也不知道它为什么这样做…)

使用您选择的文本编辑器,在本地系统上创建该文件。去掉sudo这个词;给它一个额外的第一行#!/bin/sh。使用chmod +x create-redhawk-repo使其可执行。

现在它是一个普通的shell脚本,在你的Dockerfile中你可以只RUN它。

COPY create-redhawk-repo ./
RUN ./create-redhawk-repo

但是!如果您看一下脚本实际做了什么,它只是将一个文件写入/etc/yum.repos.d,LDIR占位符被替换为其他目录。Docker映像中的文件系统布局是固定的,在大多数情况下,没有特别的理由使用环境变量或构建参数来保存文件系统路径。您可以在文件

中使用固定路径
[redhawk]
name=REDHAWK Repository
baseurl=file:///redhawk-yum/
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhawk

和Dockerfile中,按原样COPY该文件,并确保下载的包存档在该目录中。调整安装说明:

ARG redhawk_version=3.0.1
RUN wget https://github.com/RedhawkSDR/redhawk/releases/download/$redhawk_version/
redhawk-yum-$redhawk_version-el7-x86_64.tar.gz 
&& tar xzf redhawk-yum-$redhawk_version-el7-x86_64.tar.gz 
&& rm redhawk-yum-$redhawk_version-el7-x86_64.tar.gz 
&& mv redhawk-yum-$redhawk_version-el7-x86_64 redhawk-yum 
&& rpm -i redhawk-yum/redhawk-release*.rpm
COPY redhawk.repo /etc/yum.repos.d/

请记住,在Dockerfile中,你是root,除非你已经切换到另一个USER(在这种情况下,你可以使用USER root切换回来);一般来说,Docker中根本不需要sudo,只要在这些说明中出现的地方删除sudo就可以了。

我如何得到Dockerfile在创建图像时执行此命令?

只使用printf并将此命令作为单行运行:

FROM image_name:image_tag
ARG LDIR="/default/folder/if/argument/not/set"
# if container has sudo command and default user is not root
# you should choose this variant
RUN printf '[redhawk]nname=REDHAWK Repositorynbaseurl=file://%s/nenabled=1ngpgcheck=1ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhawkn' "$LDIR" | sudo tee /etc/yum.repos.d/redhawk.repo
# if default container user is root this command without piping may be used
RUN printf '[redhawk]nname=REDHAWK Repositorynbaseurl=file://%s/nenabled=1ngpgcheck=1ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhawkn' "$LDIR" > /etc/yum.repos.d/redhawk.repo

其中LDIR是一个参数,docker构建过程应该这样运行:

docker build ./ --build-arg LDIR=`pwd`