1. 程式人生 > >Kubernetes從Private Registry中拉取容器映象的方法

Kubernetes從Private Registry中拉取容器映象的方法

原文:http://www.tui8.com/articles/news/41010.html

一、環境

由於 Kubernetes和Docker都在Active Develop的過程中,兩個專案的變動都很快,因此,特定的操作和說明在某些版本是好用的,但對另外一些版本卻是不靈光的。這裡先把環境確定清楚,避免誤導。

OS:
Ubuntu 14.04.4 LTS Kernel:3.19.0-70-generic #78~14.04.1-Ubuntu SMP Fri Sep 23 17:39:18 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

Docker:
# docker version
Client:
 Version:      1.12.2
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   bb80604
 Built:        Tue Oct 11 17:00:50 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.12.2
 API version:  1.24
 Go version:   go1.6.3
 Git commit:   bb80604
 Built:        Tue Oct 11 17:00:50 2016
 OS/Arch:      linux/amd64

Kubernetes叢集:1.3.7

私有映象倉庫:阿里雲映象倉庫

Docker映象:非公共映象,大家在測試中可以在自己的私有倉庫建立自己的測試映象
registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest

Kubernets在文件中描述了幾種訪問私有倉庫的方法,這裡挑選了那些可操作的,逐一測試一下。

二、方法1:利用Node上的配置訪問Private Registry

在玩Docker時,很多朋友都 搭建過自己的Private Registry。Docker訪問那些以basic auth方式進行鑑權的Private Registry,只需在本地執行docker login,輸入使用者名稱、密碼後,就可以自由向Registry Push映象或pull 映象到本地了:

# docker login registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api
Username: {UserName}
Password:
Login Succeeded

在這一過程結束後,Docker實際上會在~/.docker目錄下建立一個config.json檔案,儲存後續與Registry互動過程中所要使用的鑑權串(這個鑑權串只是一個base64編碼結果,安全性欠佳^_^):

# cat ~/.docker/config.json
{
    "auths": {
        "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api": {
            "auth": "xxxxyyyyzzzz"
        }
    }
}

一但Node上有了這個配置,那麼K8s就可以通過docker直接訪問Private Registry了,這是

K8s文件中與私有映象倉庫互動的第一個方法。考慮到Pod可以被排程到叢集中的任意一個Node上,需要在每個Node上執行上述login操作,或者可以簡單地將~/.docker/config.json scp到各個node上的~/.docker目錄下。

實際效果如何呢? 我們建立了一個Pod yaml,測試一下是否能run起來:

//rbd-rest-api-using-node-config.yaml
apiVersion: v1
kind: Pod
metadata:
  name: rbd-rest-api-using-node-config
spec:
  containers:
  - name: rbd-rest-api-using-node-config
    image: registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest
    imagePullPolicy: Always

我們來建立一下這個Pod並檢視pod的建立狀態:

# kubectl create -f rbd-rest-api-using-node-config.yaml
pod "rbd-rest-api-using-node-config" created
# kubectl get pods
NAME                             READY     STATUS             RESTARTS   AGE
rbd-rest-api-using-node-config   0/1       ErrImagePull       0          5s

通過describe檢視Pod失敗的詳細資訊:

# kubectl describe pod/rbd-rest-api-using-node-config
... ...

Events:
  FirstSeen    LastSeen    Count    From            SubobjectPath                    Type        Reason        Message
  ---------    --------    -----    ----            -------------                    --------    ------        -------
  1m        1m        1    {default-scheduler }                            Normal        Scheduled    Successfully assigned rbd-rest-api-using-node-config to 10.66.181.146
  1m        42s        3    {kubelet 10.66.181.146}    spec.containers{rbd-rest-api-using-node-config}    Normal        Pulling        pulling image "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest"
  1m        42s        3    {kubelet 10.66.181.146}    spec.containers{rbd-rest-api-using-node-config}    Warning        Failed        Failed to pull image "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest": image pull failed for registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest, this may be because there are no credentials on this request.  details: (Error: image xxxx/rbd-rest-api:latest not found)
  1m        42s        3    {kubelet 10.66.181.146}                            Warning        FailedSync    Error syncing pod, skipping: failed to "StartContainer" for "rbd-rest-api-using-node-config" with ErrImagePull: "image pull failed for registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest, this may be because there are no credentials on this request.  details: (Error: image xxxx/rbd-rest-api:latest not found)"
... ...

這個方法對我們的環境並不有效。並且經過多次測試,結果依舊,K8s無法從Private Registry獲取我們想要的映象檔案:(。

三、方法2:通過kubectl建立docker-registry的secret

K8s提供的第二種方法是通過kubectl建立一個 docker-registry的secret,並在Pod描述檔案中引用該secret以達到從Private Registry Pull Image的目的。

操作之前,我們先刪除掉各個Node上的~/.docker/config.json。

執行kubectl create secret docker-registry時需要提供private registry的訪問UserName和Password:

# kubectl create secret docker-registry registrykey-m2-1 --docker-server=registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api --docker-username={UserName} --docker-password={Password} [email protected]
secret "registrykey-m2-1" created

# kubectl get secret
NAME                  TYPE                                  DATA      AGE
registrykey-m2-1      kubernetes.io/dockercfg               1         29s

secret: registrykey-m2-1建立成功。我們來測試一下引用這個secret物件的Pod是否能Pull Image成功並Run起來。Pod yaml檔案如下:

//rbd-rest-api-registrykey-m2-1.yaml

apiVersion: v1
kind: Pod
metadata:
  name: rbd-rest-api-registrykey-m2-1
spec:
  containers:
  - name: rbd-rest-api-registrykey-m2-1
    image: registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest
    imagePullPolicy: Always
  imagePullSecrets:
  - name: registrykey-m2-1

建立Pod,並觀察Pod狀態:

# kubectl create -f rbd-rest-api-registrykey-m2-1.yaml
pod "rbd-rest-api-registrykey-m2-1" created

# kubectl get pods
NAME                             READY     STATUS             RESTARTS   AGE
rbd-rest-api-registrykey-m2-1    1/1       Running            0          7s
rbd-rest-api-using-node-config   0/1       ImagePullBackOff   0          29m

通過describe pod,檢視建立的event序列:

Events:
  FirstSeen    LastSeen    Count    From            SubobjectPath                    Type        Reason        Message
  ---------    --------    -----    ----            -------------                    --------    ------        -------
  1m        1m        1    {default-scheduler }                            Normal        Scheduled    Successfully assigned rbd-rest-api-registrykey-m2-1 to 10.57.136.60
  1m        1m        1    {kubelet 10.57.136.60}    spec.containers{rbd-rest-api-registrykey-m2-1}    Normal        Pulling        pulling image "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest"
  1m        1m        1    {kubelet 10.57.136.60}    spec.containers{rbd-rest-api-registrykey-m2-1}    Normal        Pulled        Successfully pulled image "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest"
  1m        1m        1    {kubelet 10.57.136.60}    spec.containers{rbd-rest-api-registrykey-m2-1}    Normal        Created        Created container with docker id d842565e762d
  1m        1m        1    {kubelet 10.57.136.60}    spec.containers{rbd-rest-api-registrykey-m2-1}    Normal        Started        Started container with docker id d842565e762d

正如我們期望的那樣,引用了secret: registrykey-m2-1的Pod成功Run起來了。

如果一個pod中有來自不同私有倉庫的不同映象,我們需要怎麼做呢?通過kubectl create secret docker-registry我們一次只能建立一個registrykey,如果要訪問兩個映象倉庫,我們就需要分別為每個倉庫建立一個registrykey。我們再來建立一個registrykey,對應的倉庫為:registry.cn-hangzhou.aliyuncs.com/xxxx/test:

# kubectl create secret docker-registry registrykey-m2-2 --docker-server=registry.cn-hangzhou.aliyuncs.com/xxxx/test --docker-username={UserName} --docker-password={Password} [email protected]
secret "registrykey-m2-2" created

[email protected]:~/pullimagetest/test# kubectl get secret
NAME                  TYPE                                  DATA      AGE
registrykey-m2-1      kubernetes.io/dockercfg               1         1h
registrykey-m2-2      kubernetes.io/dockercfg               1         6s

接下來,我們來建一個包含多個container的Pod:

//rbd-rest-api-multi-registrykeys-m2-2.yaml

apiVersion: v1
kind: Pod
metadata:
  name: rbd-rest-api-multi-registrykeys-m2-2
spec:
  containers:
  - name: rbd-rest-api-multi-registrykeys-m2-2
    image: registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest
    imagePullPolicy: Always
  - name: test-multi-registrykeys-m2-2
    image: registry.cn-hangzhou.aliyuncs.com/xxxx/test:latest
    imagePullPolicy: Always
    command:
       - "tail"
       - "-f"
       - "/var/log/bootstrap.log"
  imagePullSecrets:
  - name: registrykey-m2-1
  - name: registrykey-m2-2

在secret引用中,我們將兩個key都引用了進來。

建立該Pod:

# kubectl create -f rbd-rest-api-multi-registrykeys-m2-2.yaml
pod "rbd-rest-api-multi-registrykeys-m2-2" created

# kubectl get pod
NAME                                   READY     STATUS             RESTARTS   AGE
rbd-rest-api-multi-registrykeys-m2-2   2/2       Running            0          5s

通過pod的event,我們看看啟動的操作順序:

Events:
  FirstSeen    LastSeen    Count    From            SubobjectPath                        Type        Reason        Message
  ---------    --------    -----    ----            -------------                        --------    ------        -------
  44s        44s        1    {default-scheduler }                                Normal        Scheduled    Successfully assigned rbd-rest-api-multi-registrykeys-m2-2 to 10.57.136.60
  43s        43s        1    {kubelet 10.57.136.60}    spec.containers{rbd-rest-api-multi-registrykeys-m2-2}    Normal        Pulling        pulling image "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest"
  43s        43s        1    {kubelet 10.57.136.60}    spec.containers{rbd-rest-api-multi-registrykeys-m2-2}    Normal        Pulled        Successfully pulled image "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest"
  42s        42s        1    {kubelet 10.57.136.60}    spec.containers{rbd-rest-api-multi-registrykeys-m2-2}    Normal        Created        Created container with docker id 7c09048a41f6
  42s        42s        1    {kubelet 10.57.136.60}    spec.containers{rbd-rest-api-multi-registrykeys-m2-2}    Normal        Started        Started container with docker id 7c09048a41f6
  42s        42s        1    {kubelet 10.57.136.60}    spec.containers{test-multi-registrykeys-m2-2}        Normal        Pulling        pulling image "registry.cn-hangzhou.aliyuncs.com/xxxx/test:latest"
  42s        42s        1    {kubelet 10.57.136.60}    spec.containers{test-multi-registrykeys-m2-2}        Normal        Pulled        Successfully pulled image "registry.cn-hangzhou.aliyuncs.com/xxxx/test:latest"
  42s        42s        1    {kubelet 10.57.136.60}    spec.containers{test-multi-registrykeys-m2-2}        Normal        Created        Created container with docker id 9930834fe4a3
  42s        42s        1    {kubelet 10.57.136.60}    spec.containers{test-multi-registrykeys-m2-2}        Normal        Started        Started container with docker id 9930834fe4a3

k8s分別從兩個映象倉庫嘗試pull image,並且最終都成功了!

四、方法3:通過secret yaml檔案建立pull image所用的secret

除了上面通過kubectl可以快捷的建立pull image所用的secret外,我們還可以使用常規的手段-yaml描述檔案來建立我們需要的secret資源。

//registrykey-m3-1.yaml
apiVersion: v1
kind: Secret
metadata:
  name: registrykey-m3-1
  namespace: default
data:
    .dockerconfigjson: {base64 -w 0 ~/.docker/config.json}
type: kubernetes.io/dockerconfigjson

前面說過docker login會在~/.docker下面建立一個config.json檔案儲存鑑權串,這裡secret yaml的.dockerconfigjson後面的資料就是那個json檔案的base64編碼輸出(-w 0讓base64輸出在單行上,避免折行)。

建立registrykey-m3-1 secret:

# kubectl create -f registrykey-m3-1.yaml
secret "registrykey-m3-1" created

# kubectl get secret
NAME                  TYPE                                  DATA      AGE
myregistrykey3        kubernetes.io/dockerconfigjson        1         3h
registrykey-m2-1      kubernetes.io/dockercfg               1         1h
registrykey-m2-2      kubernetes.io/dockercfg               1         23m
registrykey-m3-1      kubernetes.io/dockerconfigjson        1         29s

對比後,我們發現通過kubectl和yaml建立的兩個registrykey secret的型別略有不同,前者是kubernetes.io/dockercfg,後者是kubernetes.io/dockerconfigjson。

接下來,我們編寫一個引用了registrykey-m3-1的Pod:

//rbd-rest-api-registrykey-m3-1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: rbd-rest-api-registrykey-m3-1
spec:
  containers:
  - name: rbd-rest-api-registrykey-m3-1
    image: registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest
    imagePullPolicy: Always
  imagePullSecrets:
  - name: registrykey-m3-1

建立Pod:

# kubectl create -f rbd-rest-api-registrykey-m3-1.yaml
pod "rbd-rest-api-registrykey-m3-1" created
# kubectl get pods
NAME                            READY     STATUS             RESTARTS   AGE
rbd-rest-api-registrykey-m3-1   1/1       Running            0          8s

建立成功。

那麼這種方法如何應對含有來自多個映象倉庫container的Pod的呢?這裡的思路與方法2略有不同。我們不需要建立並引用兩個或多個secret,而是建立一個可以訪問多個私有映象倉庫的secret,我們需要將多個映象倉庫的訪問鑑權串都放到~/.docker/config.json中:

按照方法1的介紹,我們先login registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api,得到config.json如下:

{
    "auths": {
        "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api": {
            "auth": "....省略...."
        }
    }
}

我們再login registry.cn-hangzhou.aliyuncs.com/xxxx/test,得到config.json如下:

{
    "auths": {
        "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api": {
            "auth": "....省略...."
        },
        "registry.cn-hangzhou.aliyuncs.com/xxxx/test": {
            "auth": "....省略...."
        }
    }
}

我們看到Docker自動將新login的private registry的鑑權串merge到了同一個config.json中了。現在我們基於該包含了兩個庫鑑權串的config.json建立一個新secret:registrykey-m3-2:

//registrykey-m3-2.yaml

apiVersion: v1
kind: Secret
metadata:
  name: registrykey-m3-2
  namespace: default
data:
  .dockerconfigjson: {base64 -w 0 ~/.docker/config.json}
type: kubernetes.io/dockerconfigjson

建立secret: registrykey-m3-2

# kubectl create -f registrykey-m3-2.yaml
secret "registrykey-m3-2" created

# kubectl get secrets
NAME                  TYPE                                  DATA      AGE
registrykey-m2-1      kubernetes.io/dockercfg               1         1h
registrykey-m2-2      kubernetes.io/dockercfg               1         42m
registrykey-m3-1      kubernetes.io/dockerconfigjson        1         19m
registrykey-m3-2      kubernetes.io/dockerconfigjson        1         6s

我們編輯一個包含兩個容器,引用secret “registrykey-m3-2″ 的Pod yaml:

//rbd-rest-api-multi-registrykeys-m3-2.yaml

apiVersion: v1
kind: Pod
metadata:
  name: rbd-rest-api-multi-registrykeys-m3-2
spec:
  containers:
  - name: rbd-rest-api-multi-registrykeys-m3-2
    image: registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest
    imagePullPolicy: Always
  - name: test-multi-registrykeys-m3-2
    image: registry.cn-hangzhou.aliyuncs.com/xxxx/test:latest
    imagePullPolicy: Always
    command:
       - "tail"
       - "-f"
       - "/var/log/bootstrap.log"
  imagePullSecrets:
  - name: registrykey-m3-2

建立該Pod:

# kubectl create -f rbd-rest-api-multi-registrykeys-m3-2.yaml
pod "rbd-rest-api-multi-registrykeys-m3-2" created

# kubectl get pod
NAME                                   READY     STATUS             RESTARTS   AGE
rbd-rest-api-multi-registrykeys-m3-2   2/2       Running            0          4s

Pod建立成功!

五、呼叫API建立registrykey secret

對比了方法2和方法3,方法2更簡潔,方法3更強大。但在任何一個產品中,secret都不應該是手動建立的,在這種情況下, API建立 registrykey secret便是必經之路。一旦選擇通過API建立,我們顯然將依仗著方法2中的原理,將config.json中的內容通過API請求的Body Post給K8s api server。

如何在遠端構建出config.json的內容呢繼而構建出secret yaml中.dockerconfigjson的值資料呢?我們發現config.json套路中,唯一不確定的就是每個private repository下的auth串,那麼這個串是啥呢?你大可base64 -d一下:

# echo -n "VXNlck5hbWU6UGFzc3dvcmQ="|base64 -d
UserName:Password

沒錯,實質上這個auth串就是UserName:Password的base64編碼值。因此,你首先要用某個倉庫的UserName和Password按照’UserName:Password’格式進行base64編碼,利用編碼的結果值構造json內容,比如:

{
    "auths": {
        "registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api": {
            "auth": "VXNlck5hbWU6UGFzc3dvcmQ="
        }
}

然後對這段json資料再做base64編碼,所得到的值就是secret yaml中的.dockerconfigjson的值資料。至此,我們來通過API建立一個secret:

$ curl -v -H "Content-type: application/json"  -X POST -d ' {
  "apiVersion": "v1",
  "kind": "Secret",
  "metadata": {
    "name": "registrykey-m4-1",
    "namespace": "default"
  },
  "data": {
    ".dockerconfigjson": "{cat ~/.docker/config.json |base64 -w 0}"
  },
  "type": "kubernetes.io/dockerconfigjson"
}' http://10.57.136.60:8080/api/v1/namespaces/default/secrets

# kubectl get secret
NAME                  TYPE                                  DATA      AGE
registrykey-m2-1      kubernetes.io/dockercfg               1         2h
registrykey-m2-2      kubernetes.io/dockercfg               1         1h
registrykey-m3-1      kubernetes.io/dockerconfigjson        1         43m
registrykey-m3-2      kubernetes.io/dockerconfigjson        1         24m
registrykey-m4-1      kubernetes.io/dockerconfigjson        1         18s

基於registrykey-m4-1,我們啟動一個Pod:

//rbd-rest-api-registrykey-m4-1.yaml

apiVersion: v1
kind: Pod
metadata:
  name: rbd-rest-api-registrykey-m4-1
spec:
  containers:
  - name: rbd-rest-api-registrykey-m4-1
    image: registry.cn-hangzhou.aliyuncs.com/xxxx/rbd-rest-api:latest
    imagePullPolicy: Always
  imagePullSecrets:
  - name: registrykey-m4-1

# kubectl create -f rbd-rest-api-registrykey-m4-1.yaml
pod "rbd-rest-api-registrykey-m4-1" created

# kubectl get pod
NAME                            READY     STATUS             RESTARTS   AGE
rbd-rest-api-registrykey-m4-1   1/1       Running            0          5s

Pod建立成功!


相關推薦

KubernetesPrivate Registry容器映象方法

原文:http://www.tui8.com/articles/news/41010.html 一、環境 由於 Kubernetes和Docker都在Active Develop的過程中,兩個專案的變動都很快,因此,特定的操作和說明在某些版本是好用的,但對另外一些版本

git遠端倉庫指定分支

若本地分支不存在的情況: git checkout -b 本地分支名稱 origin/遠端分支名稱 使用該方式會在本地新建分x,並自動切換到該本地分支. git fetch origi

es全部數據/大量數據 使用scroll+scan避免深分頁

數據量 技術 blog nbsp 怎麽辦 聚合 超過 不能 current es一次請求默認返回的數據條數是10條,可以通過設置size參數來控制返回數據的條數: 如果要返回很多數據,可以把size設置的很大,不過elastic search默認size最大不能超過1

Kubernetes之解決k8s.gcr.io映象失敗問題

前言   因谷歌網路限制問題,國內的K8ser大多數在學習Kubernetes過程中因為映象下載失敗問題間接地產生些許失落感,筆者也因此腦殼疼,故翻閱資料得到以下解決方式:   在應用yaml檔案建立資源時,將檔案中映象地址進行內容替換即可:   將k8s.gcr.io替換為   registry.c

Kubernetes:如何解決k8s.gcr.io映象失敗問題

簡介 新版本的Kubernetes在安裝部署中,需要從k8s.grc.io倉庫中拉取所需映象檔案,但由於國內網路防火牆問題導致無法正常拉取,本文將介紹如何繞過此問題,來完成業務的部署。 問題描述 使用Kubernetes V1.11.3版本部署叢集業務,在進行kubea

git 從新的git 庫---變換git地址用;

http light rem nbsp sharp amp example bsp div 2.先刪後加 git remote rm origin git remote add origin [url]-----     example    :   git rem

批量更新程式碼整理(程式碼庫)陣列批量資料的方法

查詢出所有的資料,分批插入。從原來的所有的list 資料裡面,每次拿出X 條資料,再批量更新 public void insertStudent() { List<Student> list = studentDao.listAllStudentForStat(); i

Maven踩坑(程式碼庫專案下來,別人家的沒問題,而你的有問題)

當你從程式碼庫中拉專案下來,別人家的沒問題,而你的有問題,jdk配置問題就不說了,自己弄好。 如果你出現ClassNotFind 或者NotFindMethod 之類的錯誤,那肯定是相應的jar沒有正確下載。   這個時候你先Maven--》UpdataProject ,多

另類爬蟲:PDF檔案表格資料

簡介   本文將展示一個稍微不一樣點的爬蟲。   以往我們的爬蟲都是從網路上爬取資料,因為網頁一般用HTML,CSS,JavaScript程式碼寫成,因此,有大量成熟的技術來爬取網頁中的各種資料。這次,我們需要爬取的文件為PDF檔案。本文將展示如何利用Python的camelot模組

國內映象搭建Kubernetes

安裝kubeadmin 所有節點執行 使用阿里雲映象源安裝kubelet kubeadm kubectl cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes base

第十一章 網站圖片文字

#!/usr/bin/env python # _*_ coding:utf-8 _*_ #這一節是數144頁從網站圖片抓取文字的程式碼, #需要安裝tesseract,它是開源的可以通過訓練識別出字型

spring cloud 註冊中心遠端配置檔案錯誤幾種解決方法

1.檢查config server 是否能正常訪問2.檢查config client配置:1)必須是"bootstrap"命名的引導配置檔案2)spring: application: name: 這裡配置的名稱需要與遠端庫的配置檔名稱一致 或者使用spring.

docker國內映象映象加速registry-mirrors配置修改

由於國內訪問直接訪問docker hub網速比較慢,拉取映象的時間就會比較長。一般我們會使用映象加速或者直接從國內的一些平臺映象倉庫上拉取。 我比較常用的是網易的映象中心和daocloud映象市場。 網易映象中心:https://c.163.com/hub#

Sql Server儲存過程一個表資料填充到另一張表

  set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go -- ============================================= -- Author:  <alex,,Name> -- Create

輸入兩個整數n和m,1-n隨意幾個數,使其和等於m

程式設計求解,輸入兩個整數n和m,從數列1,2,3,……n中隨意取幾個數,使其和等於m。要求將所有的可能組合列出來。 求解思路: 1.首先判斷,如果n>m,則n中大於m的數不可能參與組合,此時置n = m; 2.遞迴求解 #include<

Java實現輸入兩個整數n和m,0-n隨意幾個數,使其和等於m

程式設計求解,輸入兩個整數n和m,從數列1,2,3,……n中隨意取幾個數,使其和等於m。要求將所有的可能組合列出來。 思路: 1.首先判斷,如果n>m,則n中大於m的數不可能參與組合,此時置n = m; 2.將最大數n加入且n == m,則滿足條件,

輸入兩個整數n和m,0-n隨意幾個數,使其和等於m

程式設計求解,輸入兩個整數n和m,從數列1,2,3,……n中隨意取幾個數,使其和等於m。要求將所有的可能組合列出來。實際上就是一個揹包問題。 求解思路: 1.首先判斷,如果n>m,則n中大於m

(docker映象安裝啟動,用navicat連結不上,報1251)修改 Docker-MySQL 容器的 預設使用者加密規則

問題的原因:是從MySQL8.0 開始,預設的加密規則使用的是 caching_sha2_password。 我看了下我從官方拉下來的 docker 映象版本是8以上版本。 在啟動MySQL 容器的時候,可以修改一些設定的。主要有2種方式。1. 自定義配置檔案,並 moun

docker 阿里雲映象倉庫Ubuntu映象

開啟docker,開啟後會在工作列看到切換為開啟windows powershell用這條命令登陸阿里雲docker login [email protected] registry.cn-hangzhou.aliyuncs.com登入registry的使用

C語言花生米(棋子)系列問題。一堆輪流的情況。

最簡單情況 描述 Tom和Jerry是鄰居,他們都喜歡吃花生米。Tom的信條是“規則永遠由強者制定,弱者只有遵守的權力”;Jerry則深信“頭腦比拳頭更有力量”。除此之外,他們都很聰明,恩,至少有211工程大學本科生水平。 五一長假第一天,Tom和Jer