Postgresql Dockerfile vs shell

Postgresql Dockerfile vs shell,postgresql,docker,shell,dockerfile,Postgresql,Docker,Shell,Dockerfile,我正在尝试创建一个安装了sqlite和postgreSQL的ubuntu映像。我很困惑我所做的是否是最佳实践 我发现我可以构建一个非常简单的dockerfile,并通过shell安装sqlite和postgresql(使用docker run-it[image\u name]) 所以我会有一个这样的dockerfile FROM ubuntu:18.04 ENV TZ=[time zone data] RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localt

我正在尝试创建一个安装了sqlite和postgreSQL的ubuntu映像。我很困惑我所做的是否是最佳实践

我发现我可以构建一个非常简单的dockerfile,并通过shell安装sqlite和postgresql(使用
docker run-it[image\u name]

所以我会有一个这样的dockerfile

FROM ubuntu:18.04
ENV TZ=[time zone data]
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
然后运行
docker-build-some-container:1.0.
然后运行
docker-run-it-some-container:1.0
,这将给我一个shell,然后在shell中运行安装命令,如
apt-get-install-postgres-12

这是构建图像的正确方法吗?我不知道这是否是一个好方法,因为许多在线资料不使用shell,而是使用dockerfile来指定要安装和运行的内容


使用dockerfile比通过shell编辑图像有什么好处?

dockerfile是一组用于构建图像的说明。你应该用它来准备所有你需要的工作,这样下次你旋转容器时就不必做任何准备工作了


Dockerfile中没有安装postgres意味着每次您想要使用容器时,您都必须打开一个shell并手动安装它,而不仅仅是运行容器并准备好一个数据库供您使用。

一旦您退出正在运行的机器,它就消失了,您需要重新创建它。您手动输入的每个命令都将消失。DockerFile是一种从头开始创建图像的方法

从更大的角度来看:虚拟机是有用的,我们可以就此达成一致,是吗?它们允许您在一个简单的环境中运行复杂的服务,避免了您可能希望并行运行的其他内容的复杂性。不过,建立虚拟机可能会很痛苦;你需要启动机器本身,然后登录它来安装所有你需要的东西。这可能既复杂又耗时


Docker简化了虚拟机在已知良好状态下的启动和运行:您可以在Docker文件中定义创建所需虚拟机所需的步骤,基本上就是这样。Docker将通过一个简单的命令构建机器并运行它,而且它非常高效(通过层缓存和紧密的操作系统集成),您所需要的只是一个文本文件,您可以将其签入版本控制系统(而不是多GB虚拟机映像)。

如果您维护Docker文件,您可以使用
docker build
更改并干净地重建图像。如果直接在容器中执行更改,则每当容器出现问题时,必须重新播放每个步骤。这个问题相当广泛,因此使用DockerFile有很多优点。将
Dockerfile
视为构建图像的方法,将图像视为模板,您可以根据需要生成尽可能多的容器,所有内容都以一致且可复制的方式进行。非常感谢!我试图使用shell bc,我不得不修改一个特定的文件来安装依赖项。基本上我想安装sqlite并编辑模块的源代码。如果我使用的是shell,我会使用vim完成这项工作,但是我如何通过dockerfile编辑文件?将修改后的文件包含在docker图像旁边,并将其作为dockerfile的一部分复制到系统中,或者想出一种脚本化的方法来更改文件,作为dockerfile的一部分(
sed
也许?),非常感谢!我将研究如何做到这一点!