首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在每次不重建图像的情况下更新源代码?

如何在每次不重建图像的情况下更新源代码?
EN

Stack Overflow用户
提问于 2021-11-29 14:01:14
回答 2查看 5.5K关注 0票数 8

是否有一种方法可以避免每次我修改源代码时重建我的Docker形象?

我认为我已经对我的Dockerfile进行了足够的优化,以减少构建时间,但是它总是需要2个命令和一些等待时间,有时只是添加了一行代码。它比简单的CTRL +S更长,并检查结果。

对于代码中的每个小更新,我必须执行的命令如下:

代码语言:javascript
复制
docker-compose down
docker-compose build
docker-compose up

这是我的Dockerfile:

代码语言:javascript
复制
FROM python:3-slim as development

ENV PYTHONUNBUFFERED=1

COPY ./requirements.txt /requirements.txt
COPY ./scripts /scripts

EXPOSE 80

RUN apt-get update && \
    apt-get install -y \
    bash \
    build-essential \
    gcc \
    libffi-dev \
    musl-dev \
    openssl \
    wget \
    postgresql \
    postgresql-client \
    libglib2.0-0 \
    libnss3 \
    libgconf-2-4 \
    libfontconfig1 \
    libpq-dev && \
    pip install -r /requirements.txt && \
    mkdir -p /vol/web/static && \
    chmod -R 755 /vol && \
    chmod -R +x /scripts

COPY ./files /files

WORKDIR /files

ENV PATH="/scripts:/py/bin:$PATH"

CMD ["run.sh"]

这是我的docker-compose.yml文件:

代码语言:javascript
复制
version: '3.9'

x-database-variables: &database-variables
  POSTGRES_DB: ${POSTGRES_DB}
  POSTGRES_USER: ${POSTGRES_USER}
  POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
  ALLOWED_HOSTS: ${ALLOWED_HOSTS}

x-app-variables: &app-variables
  <<: *database-variables
  POSTGRES_HOST: ${POSTGRES_HOST}
  SPOTIPY_CLIENT_ID: ${SPOTIPY_CLIENT_ID}
  SPOTIPY_CLIENT_SECRET: ${SPOTIPY_CLIENT_SECRET}
  SECRET_KEY: ${SECRET_KEY}
  CLUSTER_HOST: ${CLUSTER_HOST}
  DEBUG: 0

services:
  website:
    build:
      context: .
    restart: always
    volumes:
      - static-data:/vol/web
    environment: *app-variables
    depends_on:
      - postgres

  postgres:
    image: postgres
    restart: always
    environment: *database-variables
    volumes:
      - db-data:/var/lib/postgresql/data

  proxy:
    build:
      context: ./proxy
    restart: always
    depends_on:
      - website
    ports:
      - 80:80
      - 443:443
    volumes:
      - static-data:/vol/static
      - ./files/templates:/var/www/html
      - ./proxy/default.conf:/etc/nginx/conf.d/default.conf
      - ./etc/letsencrypt:/etc/letsencrypt

volumes:
  static-data:
  db-data:
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-29 18:03:14

快速回答

是否有一种方法可以避免每次修改源代码时重建我的Docker映像?

如果你的应用程序需要一个构建步骤,你不能跳过它。

在您的示例中,您可以在python之前安装,因此在每次修改源代码时,您只需要运行您的python,而不是整个堆栈:post话母、代理等等。

码头目的

主要的对接目标或特性是使开发人员能够将应用程序打包到易于在任何地方部署的容器中,从而简化您的基础设施。

因此,从这个意义上说,停靠并不严格地适用于开发阶段的。在开发阶段,程序员应该使用专门的IDE (eclipse、intellij、visual等)来创建和更新源代码。另外,一些语言,如java、c#和框架(如react/ languages )需要一个构建阶段的

这些IDE具有热重加载(源代码更改时自动更新应用程序)、变量和方法自动完成等功能。这些特性可以减少开发人员的时间。

开发人员更改源代码的Docker

不是主要目标,但如果您没有专门的ide,或者您在一个非常有限的开发人员工作区(没有管理权限、网络限制、windows、端口等),码头可以拯救您的

如果您是一个java开发人员(例如),您需要在您的机器上安装java和一些IDE,比如eclipse、配置maven等等。使用docker,您可以使用所有所需的技术创建一个映像,建立--在您的源代码码头容器之间建立一种连接。这个连接在坞中称为

代码语言:javascript
复制
docker run --name my_job -p 9000:8080 \
-v /my/python/microservice:/src \
python-workspace-all-in-one

在前面的示例中,您可以直接在/my/python/microservice上编码,只需输入my_job并运行python /src/main.py。它将在没有python或主机上的任何要求的情况下工作。一切都将在python-workspace-all-in-one

对于需要构建过程的技术: java & c#,需要时间限制,因为开发人员应该对任何源代码更改执行构建。正如我所解释的,在使用专门化的ide时并不需要这样做。

我的例子是不需要构建过程的技术,比如: php,仅仅是库/依赖项安装,docker的工作方式与专用IDE几乎一样。

本地发展用热装码头

在你的例子中,你的应用是基于python的。Python不需要构建过程。只需安装库,所以如果您想使用docker (而不是传统的方法)使用python进行开发:安装python、执行python app.py等,您应该遵循以下步骤:

不要将源代码复制到container

  • Just,将requirements.txt传递给container

  • Execute,将pip安装在container

  • Run中,应用程序在container

  • Create中,一个停靠卷:容器

上的源代码->内部文件夹

这里是一个使用热重加载的python框架的示例:

代码语言:javascript
复制
FROM python:3
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY requirements.txt /usr/src/app
RUN pip install -r requirements.txt
CMD [ "mkdocs", "serve",  "--dev-addr=0.0.0.0:8000" ]

以及如何构建开发版本:

代码语言:javascript
复制
docker build -t myapp-dev .

以及如何使用卷运行它来同步您的开发人员更改的:

代码语言:javascript
复制
docker run --name myapp-dev -it --rm -p 8000:8000 -v $(pwd):/usr/src/app mydocs-dev

总之,这将是在开发阶段使用docker运行应用程序的流程:

在应用程序(数据库、app等)之前启动需求,如果可以在python < code >F 161< browser上使用某种热重载库,则

  • 为开发目的创建一个特殊的Dockerfile文件,为开发目的构建对接者映像,运行

  • ,运行与容器

  • 同步源代码的应用程序,修改源代码

<代码>H 160。

无热装填的地方开发码头

如果不能使用热重新加载库,则无论何时需要测试源代码修改,都需要构建和运行。在这种情况下,您应该将源代码复制到容器中,而不是按照前面的方法与卷同步:

代码语言:javascript
复制
FROM python:3
RUN mkdir -p /usr/src/app
COPY . /usr/src/app
WORKDIR /usr/src/app
RUN pip install -r requirements.txt
RUN mkdocs build
WORKDIR /usr/src/app/site
CMD ["python", "-m", "http.server", "8000" ]

应采取以下步骤:

在应用程序(数据库、apis等)之前,stage

  • developer

  • 启动需求,

  • 为开发创建一个特殊的Dockerfile,修改源

代码语言:javascript
复制
docker build -t myapp-dev.

  • run

代码语言:javascript
复制
docker run --name myapp-dev -it --rm -p 8000:8000 mydocs-dev
票数 3
EN

Stack Overflow用户

发布于 2021-11-29 14:04:57

通过docker-compose.yml将脚本文件直接装入容器中

代码语言:javascript
复制
volumes:
  - ./scripts:/scripts
  - ./files:/files

请记住,如果在Dockerfile中使用WORKDIR,则必须使用前缀。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70155930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档