我可以通过交互方式从Dockerfile构建Docker容器并分配一些伪TTY吗?


12

我从Dockerfile下面构建容器:

FROM ubuntu:14.04
...
RUN apt-get update && apt-get install -y vim
#RUN ssh-keygen -f /root/.ssh/id_rsa -N strongpass123$%^
RUN ssh-keygen -f /root/.ssh/id_rsa
...

我很少这样做,但是在使用前后都有很多命令ssh-keygen

我知道我可以从脚本开始docker exec -it thirsty_darwin sh script.sh,然后标记图像,然后使用容器(图像)链接,但这并不是我想要的清晰解决方案。

更糟糕的情况是ssh-add ~/.ssh/id_rsa我必须使用Expect工具。Expect工具已经硬编码了我的密码。我不想做。

Answers:


17

通常,您不应在Docker映像中包含任何秘密。有关此主题的更多信息,请参见此答案

正如本期中所述, Docker 有充分的理由不支持交互式构建。

如果您确实需要这样做,则可以这样使用docker commit

docker build -t thirsty_darwin_base /path/to/Dockerfile
docker run -it --name=thirsty_darwin_changes thirsty_darwin_base /bin/bash
# do interactive stuff in the shell, then exit
docker commit thirsty_darwin_changes thirsty_darwin

现在thirsty_darwin有了您的交互式更改。

更新:自撰写此答案以来,Docker已发布了更全面的机密管理


正如我提到的那样,我已经找到了解决方案,但是第一个链接(此答案)对我的问题有很好的解决方法。我将通过VOLUME主机安装密钥,而不是在容器中创建自己的密钥。谢谢!
koralgooll's

1
我敦促您不要做docker commit通常的事情-它会使您陷入“金色形象”的一角。
Sobrique '16

@Sobrique很好。这是码头工人不鼓励互动或其他非确定性建立的原因之一
马特·沃华夫

那么Doc​​ker是否仅用于构建简单的机器?因为许多安装将需要用户交互。我不能仅在我的构建中使用Dockerfile,因为我需要安装SAGE,它会向用户询问一些问题。
Magno C

@MagnoC,不,您不能使用Docker构建任何东西。Dockerfiles背后的想法是,运行时始终希望获得相同的结果。交互式输入可以改变这一点。正如Matt所说,您可以将更改后的容器提交到映像中。那是我至少一直在做的事
。– musicliftsme
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.