首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何更改容器的源代码并从中生成新的映像?

如何更改容器的源代码并从中生成新的映像?
EN

Stack Overflow用户
提问于 2021-09-29 20:18:47
回答 4查看 263关注 0票数 0

我使用Kubernetes来部署它:

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: voting-app-deploy
  labels:
    name: voting-app-deploy
    app: demo-voting-app
spec:
  replicas: 1
  selector:
    matchLabels:
      name: voting-app-pod
      app: demo-voting-app
    
  template:
    metadata:
      name: voting-app-pod
      labels:
        name: voting-app-pod
        app: demo-voting-app
    spec:
      containers:
        - name: voting-app
          image: kodekloud/examplevotingapp_vote:v1
          ports:
            - containerPort: 80

有了这个事务处:

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: voting-service
  labels:
    name: voting-service
    app: demo-voting-app
spec:
  type: NodePort
  ports:
    - port: 80
      targetPort: 80
      nodePort: 30004
  selector:
    name: voting-app-pod
    app: demo-voting-app

在检查Pods是否正在运行之后,我得到一个shell到正在运行的容器,在那里我可以看到源代码并使用vi进行更改:

代码语言:javascript
复制
kubectl exec -it podsname -- sh

问题是,每当我销毁部署并将其带回来时,我就会丢失源代码中的所有更改。

这是应用程序的Dockerfile,我是从运行的容器中获得的:

代码语言:javascript
复制
# Using official python runtime base image
FROM python:2.7-alpine

# Set the application directory
WORKDIR /app

# Install our requirements.txt
ADD requirements.txt /app/requirements.txt
RUN pip install -r requirements.txt

# Copy our code from the current folder to /app inside the container
ADD . /app

# Make port 80 available for links and/or publish
EXPOSE 80

# Define our command to be run when launching the container
CMD ["gunicorn", "app:app", "-b", "0.0.0.0:80", "--log-file", "-", "--access-logfile", "-", "--workers", "4", "--keep-alive", "0"]

那么,我如何获得这个源代码并生成一个新的映像呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2021-10-01 14:59:06

我想,我已经找到了解决我的问题的办法,这并不常见。我必须澄清,我不是在从事生产环境的工作。我只想从图像中“窃取”源代码,因为我没有访问存储库的权限。

以下是我所做的:

1.创建了一个文件夹和一个子文件夹来组织代码。2.舱内容器内有一个壳:

代码语言:javascript
复制
docker exec -it containername sh

代码语言:javascript
复制
kubectl exec -it podsname -- sh

  1. 从shell中编辑了我想在源代码中编辑的内容。
  2. 将容器中的app文件夹的内容复制到我的本地子文件夹(称为'dados'):

代码语言:javascript
复制
cp -R /app /dados/

  1. 根据要编辑的图像在文件夹中创建了一个Dockerfile,然后运行命令删除/app文件夹,最后运行命令将本地文件夹的内容复制到我将要构建的新图像中。

代码语言:javascript
复制
FROM kodekloud/examplevotingapp_vote:v1
RUN rm -rf /app/*.*
COPY ./dados/app /app

  1. 在DockerHub上创建了一个名为“myusername/ my -voting-app”的新存储库来接收我的新图像。

代码语言:javascript
复制
docker build -t myusername/my-voting-app .

  1. 在图像上加上了我的回购名称:

代码语言:javascript
复制
docker tag kaiohenricunha/my-voting-app kaiohenricunha/my-voting-app

发送到码头枢纽的

代码语言:javascript
复制
docker push kaiohenricunha/my-voting-app

  1. 现在在Kubernetes上,将我的容器映像更改为我已经构建和部署的新映像。
票数 2
EN

Stack Overflow用户

发布于 2021-09-29 21:18:16

快速脏

如果您经常更改代码,并且这不是一个生产环境,您可以使用根据this线程提供的this,因为gunicorn19.0。此选项使服务器将代码更改重新加载到新工作人员中。

然后,当您想保存新映像时,可以使用docker commit“提交”或将更改保存到如下所示的新映像:

代码语言:javascript
复制
docker commit running_container_name_or_id imagerepo/image-name:tag

不过,从长远来看,这并不是推荐的,只是用于小的修复和检查。

如果您想要一个长期方法方法(如果您希望使用挂载的绑定挂载(将文件夹从主机映射到码头容器)在本地开发,并为kubernetes构建最终映像,那么长期首选用法),或者您可以使用配置映射(如本例中所示)挂载源代码:

代码语言:javascript
复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: file-configmap
  namespace: default
data:
  config.conf: |
    [mysqld]
    binlog-format=mixed

Pod (部署中的使用情况相同):

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: 
spec:
  containers:
    - name: container-name
      image: image-name
      volumeMounts:
      - name: my-file-volume
        mountPath: /path/in/container/config.conf
        subPath: config.conf
  volumes:
    - name: my-file-volume
      configMap:
        name: file-configmap
票数 2
EN

Stack Overflow用户

发布于 2021-09-29 20:32:16

你应该用卷。

卷将允许您将容器中的src代码文件夹映射到容器外部的路径,并且它不会在重新启动期间被销毁,因为它将存储在容器之外。

您可以在这里看到一个包含解释的工作示例:https://github.com/nirgeier/KubernetesLabs/tree/master/Labs/09-StatefulSet

emptyDir

emptyDir是默认卷,当pod被删除时它将被删除,但我在这里使用它向您展示如何使用卷的示例。

代码语言:javascript
复制
apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: k8s.gcr.io/test-webserver
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69382873

复制
相关文章

相似问题

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