构建一个包含Maven settings.xml的Docker镜像-这是一个坏习惯吗?

5vf7fwbs  于 2023-06-05  发布在  Maven
关注(0)|答案(2)|浏览(209)

我们有这样一个用例,我们想用maven对我们的应用程序运行验收测试。为此,我们正在考虑构建我们的docker镜像,并将maven settings.xml复制进去。显然,设置xml包含有关连接到远程人工制品仓库等的敏感数据。我陷入了一个两难的境地,我们是否应该在docker镜像中复制它,或者这是一个糟糕的做法,我们应该寻找其他方法来实现这一点。
编辑-另一点,我们的docker镜像被推送到只有授权用户才能访问的私有注册表

kx5bkwkv

kx5bkwkv1#

Docker镜像的内容绝对没有安全性。任何获得该映像的人都可以轻松地读取其docker history,并从映像中读取或复制任意文件。
因此,我会非常努力地将凭据完全排除在Docker镜像构建过程之外。如果settings.xml文件中有用户名和密码,最好是找到一种不同的方法来完成所需的设置。类似地,将ssh私钥、AWS凭证或GitHub访问令牌添加到图像将危及这些凭证。
如果settings.xml文件只包含内部主机名(但不包含凭据),或者故意设置错误的密码,那么问题就在于您愿意承受多大的风险。如果你有一个像http://build:passw0rd@build.internal.example.com这样的URL,其中的内部主机名是外部无法访问的,你可以说这是“足够”的安全性,因为用户名和密码非常容易猜测,你不需要特意去隐藏它,特别是如果你认为你可以信任你的最终用户。

szqfcxe2

szqfcxe22#

您可以使用docker secret将变量传递给settings.xml
通过在/etc/docker/daemon. json中启用buildkit来启用secret

{
  "features": {
    "buildkit": true
  }
}

在Dockerfile中创建一个settings.xml,如下所示:

COPY <<-EOT /root/.m2/settings.xml
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
    <servers>
        <server>
            <id>ID</id>
            <username>\${username}</username>
            <password>\${password}</password>
        </server>
    </servers>
    
</settings>
EOT

然后你可以使用这条RUN行来使用secret

RUN --mount=type=secret,id=my_env source /run/secrets/my_env \
  && mvn clean install -Dusername=${USERNAME} -Dpassword=${PASSWORD}

像这样构建你的DockerFile:

docker build -t test --secret id=my_env,src=.env .

将你的秘密存储在Dockerfile文件夹中名为.env的文件中,如下所示:

USERNAME=toto
PASSWORD=toto

在RUN行中读取秘密,然后销毁它。

相关问题