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

qrjkbowd  于 2023-01-04  发布在  Docker
关注(0)|答案(2)|浏览(119)

我正在按照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执行此命令?
(Also,虽然我可以看到这个命令创建了文件/etc/yum.repos.d/redhawk.repo,其中包含从[redhawk]到gpgkey=....的行,但我不知道如何解析这个命令,也不知道它到底为什么这样做...)

tv6aics1

tv6aics11#

使用您选择的文本编辑器,在您的本地系统上创建文件,删除单词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中,除非切换到另一个USER,否则您是root用户(在这种情况下,您可以使用USER root切换回来);在Docker中通常根本不需要sudo,只需删除这些说明中出现的sudo

6rqinv9w

6rqinv9w2#

如何在创建映像时让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 Repository\nbaseurl=file://%s/\nenabled=1\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhawk\n' "$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 Repository\nbaseurl=file://%s/\nenabled=1\ngpgcheck=1\ngpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhawk\n' "$LDIR" > /etc/yum.repos.d/redhawk.repo

其中LDIR是一个参数,Docker构建过程应如下运行:

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

相关问题