在http://docs.docker.com/engine/reference/builder/#arg中,它建议秘密不通过ARGS传递.
注意:建议不要使用构建时变量来传递github密钥,用户凭据等秘密.
什么时候秘密通过构建时变量传递到危险之中?
有时在构建Docker镜像时需要使用敏感数据.例如,用于下载远程文件或从私有存储库安装依赖项的API令牌或SSH密钥.可能需要分发结果图像并省略用于构建它的敏感凭证.如何才能做到这一点?
我见过docker-squash,可以将多个图层压成一个,从最终图像中删除任何已删除的文件.但是有更惯用的方法吗?
我在带有织物的django docker容器中创建了createperperuser.
要在django中创建超级用户,我需要在django交互模式下运行它:
./manage.py createsuperuser
Run Code Online (Sandbox Code Playgroud)
因为我想让它在Fabric脚本中运行,所以我发现这个命令可以避免输入密码
echo "from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'admin@example.com', 'pass')" | ./manage.py shell
Run Code Online (Sandbox Code Playgroud)
然后我把它与"docker exec"放在一起,在我的django容器中运行它
docker exec container_django echo "from django.contrib.auth.models import User; User.objects.create_superuser('admin', 'admin@example.com', 'pass')" | ./manage.py shell
Run Code Online (Sandbox Code Playgroud)
问题出来了linux管道,管道(|)左边的所有内容(包括docker exec)到它的右边(./ manage.py shell)
这不仅是困难的部分,考虑将所有这些容器放入结构运行中,这意味着它们需要两端的引号.它会让整件事变得非常难看.
fabric run:
run("docker exec container_django {command to create django super user}")
Run Code Online (Sandbox Code Playgroud)
我仍在努力研究如何在面料运行中制作至少垃圾工作,但我不知道该怎么做.
我的 Tomcat 容器需要必须受到良好保护的数据,即用于数据库访问的密码以及用于单点登录到其他系统的证书和密钥。
我已经看到一些使用-e或-env-file将秘密数据传递给容器的建议,但这可以通过 docker inspect 发现(-env-file也在docker inspect 中显示文件的所有属性)。
另一种方法是将带有机密的数据容器链接到服务容器,但我不喜欢在我的注册表中包含此数据容器的概念(可供更广泛的人访问)。我知道我可以设置一个私有注册表,但是我需要不同的注册表来进行测试和生产,而且每个可以访问生产注册表的人仍然可以访问秘密数据。
我正在考虑使用包含机密数据的目录设置我的服务器并将机密数据安装到我的容器中。这对于具有不同秘密的测试和生产服务器非常有用。但它创建了容器对我的特定服务器的依赖。
所以我的问题是:您如何处理秘密数据,该问题的最佳解决方案是什么?
我正在尝试在Docker中构建一个图像,它需要一些秘密文件来执行诸如从私有git repo中提取的内容.我见过很多人用这样的代码:
ADD id_rsa /root/.ssh/id_rsa
RUN chmod 700 /root/.ssh/id_rsa
RUN touch /root/.ssh/known_hosts
RUN ssh-keyscan github.com >> /root/.ssh/known_hosts
RUN git clone git@github.com:some/repo.git /usr/local/some_folder
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但这意味着我必须将我的私人id_rsa与我的图像存储在一起,这对我来说是一个坏主意.我宁愿做的是将我的秘密文件保存在像s3这样的云存储中,只需将凭据作为环境变量传递,以便能够将其他所有内容都删除.
我知道我可以docker run在-e交换机中传递环境变量,但是如果我在构建时需要一些文件(比如id_rsa来执行git克隆),我该怎么办?理想情况下,我能够传递环境变量docker build,但这是不可能的(我无法理解为什么).
那么,想法?在这里做什么是规范/正确的事情?我不能成为这个问题的第一人.
我有一个可以工作的码头图像.要让它完全正常工作,我必须运行
sudo docker run -d -p 80 --name myimage -e ADMIN_USER="user1" -e ADMIN_PASSWORD='password1' leonixyz/myimage:1.0
Run Code Online (Sandbox Code Playgroud)
第一次执行图像时,我的代码会在里面配置应用程序.
这很方便,因为每次我需要一个新的应用程序实例时,必须每次为不同的用户配置,我可以传递不同的环境变量docker run,我的代码将专门为新用户配置容器.
不幸的是,我看到这些变量无法从容器中删除.
如果我做:
sudo docker exec -it <container_id> bash
Run Code Online (Sandbox Code Playgroud)
然后我可以看到变量ADMIN_USER并且ADMIN_PASSWORD(显然)仍然存在.
我试着unset ADMIN_PASSWORD在我的一次性配置代码的末尾,但它不起作用.
还运行unset ADMIN_PASSWORD在运行容器bash shell中是行不通的.
有没有办法从容器中删除环境变量,一旦启动它?
谢谢
编辑 指出最好不要通过环境变量传递秘密,这里解释了一个很好的解决方法https://github.com/docker/docker/issues/13490#issuecomment-162125128
docker ×6
security ×2
build ×1
credentials ×1
django ×1
dockerfile ×1
fabric ×1
python ×1
shell ×1