在构buildDocker容器时迭代的最佳方法是什么?
我正在尝试构build一些Docker容器,并且发现了编辑Dockerfile的迭代过程,并在其中运行脚本,笨重。 我正在寻找最佳做法,并找出其他人如何去做。
我最初的过程是:
docker build -t mycontainer mycontainer
-
docker run mycontainer
-
docker exec -i -t < container id > "/bin/bash" # get into container to debug
-
docker rm -v < container id >
-
docker rmi mycontainer
- 重复
这对于每一次迭代来说都很昂贵,特别是如果是错字。
这个替代过程需要less一点迭代:
- 在dockerfile中安装vim
-
docker run mycontainer
-
docker exec -i -t < container id > "/bin/bash" # get into container to edit scripts
-
docker cp
完成后复制编辑的文件。 - 如果我需要运行任何命令,我会仔细记住并更新容器外部的Dockerfile。
- 重build图像没有vim
这需要更less的迭代,但不是无痛的,因为一切都非常手动,我必须记住哪些文件更改和更新。
自从0.7版本开始,我一直在使用Docker进行生产,我一定感觉到了自己的痛苦。
Dockerfile开发工作stream程
注意:当我积极开发时,我总是在容器中安装vim。 我刚刚发布时将其从Dockerfile中取出。
- 安装tmux / gnu屏幕/ iTerm /您最喜爱的垂直分离控制台实用程序。
-
在正确的控制台上运行:
$ vim Dockerfile
-
在左侧的控制台上运行:
$ docker build -t username/imagename:latest . && docker run -it -name dev-1 username/imagename:latest
-
现在将左侧的控制台水平分割,以便运行STDOUT在上面,并且在下面的shell中。 在这里你将运行:
docker exec -it dev-1
并在内部进行编辑或进行testing:
docker exec -it dev-1 <my command>
-
每当您对Dockerfile save(
:wq!
)的工作感到满意,然后在左边的控制台中运行上面的命令。 testing行为。 如果你不开心跑步:docker rm dev-1
然后再次编辑并重复步骤#3。
定期,当我build立了太多的图像或容器,我做了以下几点:
- 删除所有容器:
docker rm $(docker ps -qa)
- 删除所有图像:
docker rmi $(docker images -q)
我假定您在备用过程中编辑的文件是构成您正在部署的应用程序的一部分的文件? 比如Bash或Python脚本?
在这种情况下,您可以在debugging过程中将它们挂载为卷,而不是将它们挂载到Docker中,以便在编辑它们时立即在Docker和主机中进行更改。
所以举个例子,如果你的代码在/ home / dragonx / codefiles,那么
docker run -v /home/dragonx/codefiles:/opt/codefiles mycontainer
然后,当您从主机或容器中编辑这些文件时,它们在容器中可用,但在杀死泊坞窗之前不需要复制它们。
以下是“构build一些docker集装箱”的最简单的方法:
docker run -it --name=my_cont1 --hostname=my_host1 ubuntu:15.10 docker run -it --name=my_cont2 --hostname=my_host2 ubuntu:15.10 ... ... docker run -it --name=my_contn --hostname=my_hostn ubuntu:15.10
这将创build“n”个容器。
在第一个“docker运行…”命令后,你将被放在一个Bash shell中。 你可以在那里做你的事情,退出并运行下一个“docker运行…”命令。
从Bash shell退出不会删除容器。 他们仍然处于“退出”状态。 您可以使用docker ps -a
命令列出它们。 你总是可以回到他们的方式:
docker start -ia my_cont1
- docker集装箱通过端口转发链接?
- 在cookiecutter-django上设置数据库的问题
- Docker:用于运行Docker镜像的terminal回声
- 在Docker中传递来自CMD的参数
- docker工确认图像? 如果是的话,它是如何实施的?
- Com.github.dockerjava.api.exception.DockerClientException:证书path(DOCKER_CERT_PATH)'/root/.docker/certs'不存在一般性讨论
- 为什么从官方的Docker镜像的PHP-FPM不适合我?
- Docker容器与2个应用程序进行交互
- 什么是/ dev / xvdf中的稀疏块设备