我正在考虑使用Docker在持续集成(CI)服务器上构建我的依赖项,这样我就不必在代理本身上安装所有运行时和库.为了实现这一点,我需要将容器内部构建的构建工件复制回主机.
那可能吗?
我想使用 Docker 容器来使用本地文件运行实用程序(特别是 Terraform)。为了快速迭代代码(例如my_stuff.tf),我想绑定挂载我的工作目录。然而,我想考虑一些相对稳定和静态的东西,比如插件。基本上我希望通过三种方式来处理事情:
.terraform/是稳定的东西,应该存在于容器中,而不是我的主机目录中,但即使在安装后也需要保留。my_stuff.tf存在于容器中(因为init需要它)和主机目录中(因为我想编辑它)。我希望我的主机目录版本覆盖容器版本。terraform.tfstate开始时可能不存在于任何一个地方,但会在运行期间生成。我希望它一存在就保留在我的主机目录中。(我猜是第四类,就像README.md我不关心它是否存在一样)
就我而言,TF 期望.terraform/配置插件的位置和terraform.tfstate(我想通过绑定安装捕获的输出之一)位于同一目录中,因此我不能仅对容器内部内容和绑定使用不同的目录-安装的东西。
# Dockerfile
FROM plugin_source AS plugins
FROM terraform_base
COPY --from=plugins terraform-provider-X /bin/
COPY my_stuff.tf /app/
WORKDIR /app
RUN /bin/terraform init
Run Code Online (Sandbox Code Playgroud)
我的运行命令:
docker run --rm -i -t --mount source=$PWD,target=/app,type=bind my_terraform <some-tf-command>
Run Code Online (Sandbox Code Playgroud)
是否有一种灵活的方法可以使绑定安装的行为与命名卷在第一次初始化时的行为相同,如https://docs.docker.com/storage/bind-mounts/#mount-into-a-non-empty-directory-中所述在集装箱上?目前,似乎我可能必须编写一个小入口点脚本,将稳定的内容符号链接到我的工作目录中。
docker run -ti -v my_passwd:/etc/passwd -v my_shadow:/etc/shadow --rm centos
[root@681a5489f3b0 /]# useradd test # does not work !?
useradd: failure while writing changes to /etc/passwd
[root@681a5489f3b0 /]# ll /etc/passwd /etc/shadow # permission check
-rw-r--r-- 1 root root 157 Oct 8 10:17 /etc/passwd
-rw-r----- 1 root root 100 Oct 7 18:02 /etc/shadow
Run Code Online (Sandbox Code Playgroud)
使用passwd时出现类似问题:
[root@681a5489f3b0 /]# passwd test
Changing password for user test.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: Authentication token manipulation …Run Code Online (Sandbox Code Playgroud)