我遵循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`