Dockerfile 中的路径解释

pka*_*mol 1 docker dockerfile

我想通过动态安装我的~/.ssh路径来运行一个容器(以便能够克隆一些私有的 gitlab 存储库)。

COPY ~/.ssh/ /root/.ssh/
Run Code Online (Sandbox Code Playgroud)

指令不起作用,因为Dockerfile相对于它为构建创建的 tmp 目录的解释路径,例如

/var/lib/docker/tmp/docker-builder435303036/
Run Code Online (Sandbox Code Playgroud)

所以我的下一个目标是尝试利用该ARGS指令,如下所示:

ARG CURRENTUSER

COPY /home/$CURRENTUSER/.ssh/ /root/.ssh/
Run Code Online (Sandbox Code Playgroud)

并运行构建:

docker build --build-arg CURRENTUSER=pkaramol <whatever follows ...>
Run Code Online (Sandbox Code Playgroud)

但是,我仍然面临同样的问题:

COPY failed: stat /var/lib/docker/tmp/docker-builder435303036/home/pkaramol/.ssh: no such file or directory
Run Code Online (Sandbox Code Playgroud)

1:如何访问Dockerfile我的主机内的特定路径?

2:是否有比复制我的.ssh目录更好的模式来从临时运行的容器中访问私有 git 存储库?(我只需要它来进行构建过程)

Mat*_*att 5

Docker 构建上下文

Dockerfile 的构建无法访问“构建上下文”目录之外的特定路径。docker build通常,这是最后一个参数.。该docker build命令压缩构建上下文并将其发送到 Docker 守护进程以从中构建镜像。构建中只能引用构建上下文中的文件。要包含用户.ssh目录,您需要将构建基于该.ssh目录或父目录(例如/home/$USER.

建立秘密

COPYADD在构建时添加或添加凭据是一个坏主意,因为凭据将保存在映像构建中,供有权访问该映像的任何人查看。这里有一些注意事项。如果您在构建中删除敏感文件后展平图像层,或者创建仅将非敏感工件复制到最终图像中的 多阶段构建(17.05+)。

使用ENVorARG也不,因为秘密最终会出现在图像历史记录中。

github 上有一个很长的关于秘密的问题,涵盖了这个想法的大部分变化。虽然很长,但值得仔细阅读其中的评论。

两种主要的解决方案是通过网络或卷获取秘密。

标准版本中不提供卷,因此这使它们变得棘手。

Docker 添加了秘密功能,但这仅在基于集群的容器的容器运行时可用。

网络秘密

风俗

Secrets github 问题有一个简洁的小网猫示例

nc -lp 10.8.8.8 8080 < $HOME/.ssh/id_rsa &
Run Code Online (Sandbox Code Playgroud)

并使用curl将其收集到 Dockerfile 中,使用它,然后一步删除它RUN

RUN set -uex; \
    curl -s http://10.8.8.8:8000 > /root/.ssh/id_rsa; \
    ssh -i /root/.ssh/id_rsa root@wherever priv-command; \
    rm /root/.ssh/id_rsa;
Run Code Online (Sandbox Code Playgroud)

为了使不安全的网络服务可访问,您可能需要向环回接口添加一个别名 IP 地址,以便您的构建容器或本地服务可以访问它,但外部任何人都无法访问。

HTTP协议

只需运行一个安装了密钥的 Web 服务器就足够了。

docker run -d \
  -p 10.8.8.8:80:80 \
  -v /home/me/.ssh:/usr/share/nginx/html:ro \
  nginx 
Run Code Online (Sandbox Code Playgroud)

您可能需要根据您的设置和安全要求添加 TLS 或身份验证。

Hashicorp金库

Vault是专门为管理机密而构建的工具。它超出了 Docker 构建的要求,它是用 Go 编写的,并且还作为容器进行分发

构建体积

摇杆

Rocker是一个自定义 Docker 映像生成器,它扩展了 Dockerfiles 以支持一些新功能。他们添加的命令MOUNT允许您在构建时安装卷。

包装机

Packer Docker Builder还允许您在构建时安装任意卷。