【问题标题】:How can I make Docker to run the latest code如何让 Docker 运行最新的代码
【发布时间】:2021-09-08 16:07:36
【问题描述】:

我的问题与this topic 有关,但总的来说,我对 Docker 有更多具体的问题。我的配置如下:

container_name: foo
    image: foo/bar
    volumes:
        - ".cachedir:/cachedir"
    env_file: 
        - .env
    ports:
        - "50052:50052"
    restart: always
    entrypoint: ["python", "serve.py"]
    logging:
        options:
            max-size: "10m"
            max-file: "3"

我在 serve.py 中做了一些更改,这是否意味着我需要完全重建我的 docker 映像才能使这些更改生效?我尝试重新启动 docker 实例,但没有运气。我试过“up --force-recreate”,但似乎也没有任何作用。

除此之外,如果我确实需要重建并且以某种方式做错了 - 显然我做错了什么 - 测试我的代码更改的更快方法是什么?

我 ssh 进入机器只是为了验证 serve.py 确实没有任何更改,它可能取决于 docker 映像本身,但我没有可用的 nano、vi、vim,所以我可以'也不要在那里编辑任何东西。

我知道这可能是一个非常常见/基本的问题,但我目前完全不知道如何让我的 docker 实例运行最新的 serve.py 代码。

【问题讨论】:

  • 您可以绑定挂载需要更改的文件/目录到容器中。然后在外部所做的任何更改都会立即反映在容器中。我将它与某种自动重启工具结合使用。就像节点的 nodemon 一样。不确定 python 的等价物是什么。

标签: python docker docker-compose


【解决方案1】:

如果我理解正确,您正在寻找在容器中的文件中应用一些代码更改的方法。如果是这种情况,请让我帮忙:

如果你要重启这个容器,或者应用 up --force-recreate 代码 您所做的更改不会生效。这样做的原因是容器本身是图像层之上的附加层。问题 - 这个附加层是不可持久的,它与容器一起死亡。如果你想改变正在运行的容器的状态(通常)然后持久化它,你应该持久化容器创建的这个额外的顶层。你可以通过 docker commit 命令来完成。官方文档是there

不过,我不推荐这种方法 - 不要在 SVC 之外进行更改。在您的情况下 - 如果您想更改代码,请将其放入您的 SVC 并重建图像。

但是,一旦主进程(PID 1)处于活动状态,容器就处于活动状态。我在 Python 方面没有经验,而且我不知道有关您的案例的很多细节 - 如果您应用的此更改需要停止此主进程然后重新开始 - 不幸的是,它将无法正常工作。所以,重建图像。

希望对你有所帮助,祝你有美好的一天。

【讨论】:

    【解决方案2】:

    通常,对于生产,建议您重建 foo/bar 以包含更新。但是,为了开发,我经常使用bind mount 覆盖图像中的文件以进行快速测试。供您参考的最小示例:

    结构:

    # tree
    .
    ├── docker-compose.yaml
    ├── Dockerfile
    └── run.py
    
    0 directories, 3 files
    

    run.py:

    print("helloworld")
    

    Dockerfile:

    FROM python:3
    WORKDIR /prod
    COPY run.py .
    CMD python run.py
    

    docker-compose.yaml:

    version: "3"
    
    services:
      app:
        build: .
    

    执行:

    # docker-compose up --build
    app_1  | helloworld
    

    为了本地开发,我用了next:

    更改 run.py:

    print("helloworld!!!")
    

    更改 docker-compose.yaml 以绑定挂载本地源文件夹:

    version: "3"
    
    services:
      app:
        build: .
        volumes:
          - $PWD:/prod
    

    执行:

    # docker-compose up
    app_1  | helloworld!!!
    

    你可以看到我看到新的!!! 输出没有构建第二次执行。

    【讨论】:

    • 谢谢!当我有时间时,我会确认这可以解决我的问题,但是就生产环境和开发环境之间的区别而言,这看起来非常直观!
    【解决方案3】:

    当您为代码库构建 Docker 映像时,Dockerfile 中会有一个层,在您构建映像时使用 COPY 命令将代码库的所有文件复制到 Docker 映像。

    当您从此映像运行容器时,该容器将仅反映您运行 docker build... 时代码库中的代码。

    现在,当您稍后在代码库中进行更改时,除非您重新构建映像,然后从这个新构建的映像运行另一个容器,否则它不会出现在映像中。这个新容器将在代码库中包含您的更改。

    在容器内进行任何更改实际上是一种反模式,但如果您真的想采用这种方式,那么将exec -it 放入您的容器中,安装 vim 或 nano 之类的编辑器,然后继续在您的代码库中进行更改容器内。

    【讨论】:

      【解决方案4】:

      要在不重新构建 docker 映像的情况下快速获得有关 Web 应用程序中工作区更改的反馈,您需要:

      • 使用 docker 卷将您的工作区映射到 docker 容器
      • 重新加载 Web 服务器以使用文件系统观察程序(如 nodemon)获取这些更改。

      要查看执行这两​​个步骤的示例,请参阅this 帖子。

      Sample github 项目你可以玩。

      【讨论】:

        猜你喜欢
        • 2018-12-23
        • 1970-01-01
        • 2015-03-27
        • 2013-12-02
        • 1970-01-01
        • 2018-03-12
        • 2017-08-28
        • 2017-07-11
        • 2022-01-20
        相关资源
        最近更新 更多