在 docker-compose 中开发。让容器识别代码更改

int*_*tar 1 containers docker docker-compose

我有一个带有 Python3 环境和安装的各种库的 docker 容器。

我正在尝试针对此环境开发一个简单的 Python 程序。

所以我拥有的是一个包含容器外部源代码的卷,该卷已添加并在 Dockerfile 中设置为 WORKDIR。

然后我向容器中加壳并尝试在命令行上运行该程序。

当我遇到错误时,我想简单地更改容器外部编辑器中的源,然后再次运行。

但是,当我这样做时,容器中的执行代码似乎没有注意到我所做的更改。

如果我做

docker-compose up --build 
Run Code Online (Sandbox Code Playgroud)

然后重建容器。

显然这是非常慢的。

当然,容器应该可以在不重建的情况下看到我正在处理的代码的更改吗?如果是这样,我该如何实现这一点?

hex*_*ide 5

使用将ADD文件烘焙到容器映像中,正如您所注意到的,更新正在运行的应用程序中的文件需要重建整个容器并重新启动。为了解决这个问题,您可以使用 复制到容器中的路径在主机上挂载一个目录ADD

要使用 Docker 执行此操作,您可以使用-v--volume。使用 Docker Compose,您可以列出要挂载的目录volumes:。例如,如果您的构建文件中有以下内容:

# Copy app code into the container working directory
ADD /my/app/code /usr/app/src
Run Code Online (Sandbox Code Playgroud)

然后,您可以在容器启动时将实时代码挂载到内置文件上(请注意,目录路径必须是绝对路径 - 您可以$PWD为此使用):

$ docker run -v /my/live/app/code:/usr/app/src python:latest
$ docker run -v "$PWD"/app/code:/usr/app/src python:latest
Run Code Online (Sandbox Code Playgroud)

等价docker-compose.yml如下:

my-service:
  image: python:latest
  volumes:
    - /my/live/app/code:/usr/app/src
    - ./relative/paths:/work/too
Run Code Online (Sandbox Code Playgroud)

文档中有更多关于绑定安装的信息。