1. 程式人生 > >在 Docker 上開發應用

在 Docker 上開發應用

原文地址

Docker 可以通過從 Dockerfile 中讀取指令來自動構建映象,Dockerfile 是一個文字檔案,其中包含了按順序排列的構建指定映象所需的全部命令。Dockerfiles 採用特殊格式,使用一系列特別的指令。可以在 Dockerfile 參考頁面 學習這些基礎知識。如果對於編寫 Dockerfile 你還是新手,那麼接著往下看吧。

本文件介紹了由 Docker 公司和 Docker 社群推薦的用於構建高效映象的最佳實踐和方法。要檢視更多實踐和建議,請點選 Dockerfile for buildpack-deps

注意:要檢視 Dockerfile 命令的詳情,點選

Dockerfile 參考頁面

1. 一般準則和建議

1.1 容器應該精簡 ephemeral

Dockerfile 定義的映像生成的容器應儘可能精簡。意思是說,在容器被停止和銷燬,並且建立和配置完成一個新的容器時,有絕對最少的設定和配置。 你可能需要檢視 十二要素應用宣言 的 Processes 部分(譯文在 這裡),以瞭解以這種無狀態方式執行容器的動機。

原文:
The container produced by the image your Dockerfile defines should be as ephemeral as possible. By “ephemeral,” we mean that it can be stopped and destroyed and a new one built and put in place with an absolute minimum of set-up and configuration. You may want to take a look at the Processes section of the 12 Factor app methodology to get a feel for the motivations of running containers in such a stateless fashion.

1.2 使用 .dockerignore 檔案

執行 docker build 命令時你所在的當前工作目錄被稱為構建上下文,Dockerfile 檔案必須在這個構建上下文中。預設情況下,Dockerfile 被假設在當前目錄中,但是可以通過 -f 標誌指定一個不同位置。不管 Dockerfile 檔案位於何處,當前目錄中的所有檔案和目錄都會作為構建上下文傳送到 Docker 守護程序。無意中包含了構建映象不需要的檔案會產生更大的構建上下文和更大的映象大小。這些反過來又會增加構建時間、獲取和上傳映象的時間以及容器的執行時間。要檢視構建上下文有多大,在構建 Dockerfile 時查詢類似下面的訊息。

Sending build context to Docker daemon  187.8MB

可以使用 .dockerignore 檔案排除與構建無關的檔案而不重構原始碼庫。該檔案支援類似 .gitignore 檔案的排除模式。有關建立此檔案的資訊,參考 這裡

1.3 使用多段構建

如果 Docker 版本是 17.05 或更高,那就可以使用 多段構建 來大幅降低最終映象的大小,而無需在構建期間跳過 through hoops 來減少中間層的數量或刪除中間檔案。

映象僅由最終一個階段構建,大部分時間既有利於構建快取,又能使映象圖層最小化。(Images being built by the final stage only, you can most of the time benefit both the build cache and minimize images layers.)

你的構建階段可能包含多個層,下面例子從最不常見的變更到最常見的變更排序:

  • 安裝構建應用程式所需的工具

  • 安裝或更新庫和依賴

  • 產生應用

一個 Go 應用程式的 Dockerfile 示例:

FROM golang:1.9.2-alpine3.6 AS build
# Install tools required to build the project
# We need to run `docker build --no-cache .` to update those dependencies
RUN apk add --no-cache git
RUN go get github.com/golang/dep/cmd/dep

# Gopkg.toml and Gopkg.lock lists project dependencies
# These layers are only re-built when Gopkg files are updated
COPY Gopkg.lock Gopkg.toml /go/src/project/
WORKDIR /go/src/project/
# Install library dependencies
RUN dep ensure -vendor-only

# Copy all project and build it
# This layer is rebuilt when ever a file has changed in the project directory
COPY . /go/src/project/
RUN go build -o /bin/project

# This results in a single layer image
FROM scratch
COPY --from=build /bin/project /bin/project
ENTRYPOINT ["/bin/project"]
CMD ["--help"]

1.4 避免安裝無用包

要降低複雜性、依賴、檔案大小和構建時間,就要避免安裝額外的或不需要的包。例如在資料庫映象中不需要文字編輯器。

1.5 每個容器只解決一個問題

將應用程式解耦為多個容器使得橫向擴充套件和重用容器變得更容易。例如,一個 Web 應用程式堆疊可能由三個獨立的容器組成,每個容器都有其獨特的映象,以解耦的方式管理 Web 應用程式、資料庫和記憶體中的快取。

你可能聽過這句話“每個容器一個程序”。雖然這個口頭禪的意圖很好,但並不一定每個容器只有一個作業系統程序。除了現在可以使用 init 程序建立容器 之外,一些程式可能會自行產生其他程序。例如,Celery 可以派生多個工作程序,或者 Apache 可能會為每個請求建立一個程序。 雖然“每個容器一個程序”是一個很好的經驗法則,但它並不是硬性規定。 盡你最大的努力使容器保持乾淨和模組化。

如果容器互相依賴,可以使用 Docker 容器網路 來確保容器之間的通訊。

1.6 最小化層數

在 Docker 17.05 甚至 1.10 之前,最小化映象的層數是很重要的。下面的改善措施緩解了這個需求:

  • Docker 1.10 及更高版本中,只有 RUN、COPY 和 ADD 命令會建立層。其他命令建立臨時的中間層映象,不會在構建時增加體積。

  • Docker 17.05 及更高版本,增加了分段構建功能,使得可以只複製所需的專案檔案到最終的映象中。這讓你可以在中間層構建過程中新增工具和除錯資訊,而不會增大最終映象的體積。

1.7 排序多行引數

只要有可能,通過按字母數字順序排列多行引數來簡化後面的更改。這有助於避免軟體包重複並使列表更容易更新。這也使得 PR 更容易閱讀和稽核。在反斜槓(\)之前新增空格也有幫助。

RUN apt-get update && apt-get install -y \
  bzr \
  cvs \
  git \
  mercurial \
  subversion

1.8 構建快取

在構建映象的過程中,Docker 會按照指定的順序執行 Dockerfile 檔案中的指令。檢查完所有指令後,Docker 會從快取中尋找可用的映象,而不是建立一個新映象。如果不想使用快取,可以在執行 docker build 命令是新增 --no-cache=true 選項。

然而,如果允許 Docker 使用快取,就需要理解它何時能,何時不能,找到匹配的映象。Docker 遵守的基本規則如下:

  • 從快取中已經存在的父映象開始,將下一條指令與從該基本映象派生的所有子映象進行比較,以檢視是否使用完全相同的指令構建了其中的一個子映象。如果沒有則快取失效。

  • 大多數情況下,簡單的將 Dockerfile 中的指令和子映象中的一個進行比較就足夠了。然而,部分指令需要更多的檢查和解釋。

  • 對於 ADDCOPY 指令,映象中的檔案內容都需要檢查併為每個檔案計算校驗和 checksum。這些校驗和中不考慮檔案的最後編輯時間和最後訪問時間。在快取查詢過程中,將校驗和與現有映象中的校驗和進行比較。如果檔案中的內容有任何更改,如內容和元資料,則快取將失效。

  • 除了 ADDCOPY 指令,快取檢查時不會通過檢查容器中的檔案來決定快取是否匹配。例如在處理 RUN apt-get -y update 命令時,不會通過檢查容器中更新過的檔案來決定快取是否命中。此時只會對比命令字串是否相同來尋找匹配的快取。

一旦關閉快取,所有後續的 Dockerfile 命令都會生成新映象,不使用快取。

2. The Dockerfile instructions

這些建議可以幫助你寫出高效的、容易維護的 Dockerfile。

FROM

只要有可能,使用官方倉庫作為映象的基礎。推薦使用 Alpine 映象,因為它的控制非常嚴格,並且保持最小(目前低於5 MB),同時仍然是完整的發行版。

LABEL

可以給映象新增標籤,來幫助專案組織映象、記錄許可資訊、幫助自動化或出於其他原因。對於每個標籤,新增一行以 LABEL 開頭並帶有一個或多個鍵值對的行。下面示例顯示了多種支援的格式。解釋性意見包含在內。

注意:如果字串中包含空格,則必須用雙引號引起來或轉義這個空格。如果字串中包含雙引號,必須轉義。

# 設定一個或多個獨立的標籤
LABEL com.example.version="0.0.1-beta"
LABEL vendor="ACME Incorporated"
LABEL com.example.release-date="2015-02-12"
LABEL com.example.version.is-production=""

映象可以有多個標籤。在 Docker 1.10 版本之前,建議將所有的標籤合併到一個 LABEL 指令中,以防止建立額外的層。現在不需要這麼做了,但是仍然支援合併標籤。

# 在同一行中設定多個標籤
LABEL com.example.version="0.0.1-beta" com.example.release-date="2015-02-12"

上面的例子也可用下面的寫法:

# 一次設定多個標籤,並使用續行字元打斷很長的行
LABEL vendor=ACME\ Incorporated \
      com.example.is-beta= \
      com.example.is-production="" \
      com.example.version="0.0.1-beta" \
      com.example.release-date="2015-02-12"

有關可使用的標籤中鍵和值的資訊,參閱 Understanding object labels。有關查詢 querying 標籤的資訊,參閱 Managing labels on objects 中與過濾相關的專案。另請參閱 Dockerfile 參考中的 LABEL

RUN

將很長或很複雜的 RUN 語句用反斜線(\)切分為多行可以讓 Dockerfile 檔案易讀、易理解並且易維護。

1. APT-GET 指令

RUN 最常見的用例可能是 apt-get 應用程式。因為 RUN apt-get 命令會安裝軟體包,有幾個需要注意的問題。

應該避免使用 RUN apt-get upgradedist-upgrade,因為許多來自父映象的“essential”基本軟體包無法在非特權容器內升級。如果父映象中的軟體包已過時,應聯絡其維護人員。如果你知道需要更新某個特定軟體包,比如“foo”,請使用 apt-get install -y foo 自動更新。

在同一個 RUN 語句中一同執行 apt-get updateapt-get install。例如:

    RUN apt-get update && apt-get install -y \
        package-bar \
        package-baz \
        package-foo

RUN 語句中單獨使用 apt-get update 會導致快取問題,並使後面的 apt-get install 指令執行失敗。例如,看下面的 Dockerfile:

    FROM ubuntu:14.04
    RUN apt-get update
    RUN apt-get install -y curl

上面的映象構建完成後,所有的層都會在 Docker 快取中。假設後面會通過新增額外的包來變更 apt-get install 這條指令:

    FROM ubuntu:14.04
    RUN apt-get update
    RUN apt-get install -y curl nginx

此時 Docker 會認為這個例子中的前兩步和上個例子的一樣,從而使用上個例子生成的快取,導致 apt-get update 命令並未執行。apt-get update 沒有執行,所以後面可能會安裝的 curlnginx 可能不是最新版本。

使用 RUN apt-get update && apt-get install -y 可以確保 Dockerfile 安裝最新版本的包,無需進一步編碼或手動干預。這種技術被稱為“快取破壞”(cache busting)。 也可以通過指定軟體包的版本來清除快取。這被稱為版本固定(version pinning),例如:

    RUN apt-get update && apt-get install -y \
        package-bar \
        package-baz \
        package-foo=1.3.*

版本固定會強制構建時檢索特定的版本,而不管快取中的內容。該技術還可以減少由於所需軟體包的意外更改而導致的故障。

下面是一個組織良好的 RUN 指令,用來演示所有的 apt-get 建議。

RUN apt-get update && apt-get install -y \
    aufs-tools \
    automake \
    build-essential \
    curl \
    dpkg-sig \
    libcap-dev \
    libsqlite3-dev \
    mercurial \
    reprepro \
    ruby1.9.1 \
    ruby1.9.1-dev \
    s3cmd=1.1.* \
 && rm -rf /var/lib/apt/lists/*

s3cmd 指定要安裝 1.1.* 版本。如果映象在之前使用的是舊的版本,指定新版本會導致 apt-get update 命令的快取破壞,從而確保安裝的是這個指定的新版本。每個包單獨出現在一行中,可以防止出現包重複的錯誤。

此外,當通過刪除 /var/lib/apt/lists 目錄來清除 apt 的快取時,可以減小映象尺寸(因為 apt 快取不會存入層)。這裡的 RUN 語句用 apt-get update 命令開頭,所以在執行 apt-get install 命令之前包快取總是會得到更新。

注意:官方的 Debian 和 Ubuntu 映象會 自動執行 apt-get clean,因此不需要顯式呼叫。

2. 使用管道

部分 RUN 命令藉助管道 pipe 將一個命令的輸出傳送到另一個命令。下面例子演示了管道符號 | 的使用:

RUN wget -O - https://some.site | wc -l > /number

Docker 使用 /bin/sh -c 直譯器執行這些命令,該直譯器只評估管道中最後一個操作的退出程式碼以確定是否成功。在上面的示例中,只要 wc -l 命令執行成功,即使 wget 命令執行失敗,此構建步驟也會成功並生成新映象。

預先設定 set -o pipefail && 命令,可以使管道中的任何一步發生錯誤時,都會導致命令執行失敗,從而不再構建映象。例如:

RUN set -o pipefail && wget -O - https://some.site | wc -l > /number

注意:並使是所有的 shell 都支援 -o pipefail 選項(比如 Debian 基礎映象中的預設 shell dash)。此時,可以使用 RUN 的 exec 形式來顯式選擇一個支援 pipefail 選項的 shell。例如:

RUN ["/bin/bash", "-c", "set -o pipefail && wget -O - https://some.site | wc -l > /number"]

CMD

CMD 指令應該用來執行映象中的軟體,可以有任意多個引數。格式為:CMD [“executable”, “param1”, “param2”…]。因此,如果映象用來執行服務,例如 Apache 和 Rails,可以通過 CMD ["apache2","-DFOREGROUND"] 來執行。事實上,所有的基於服務的映象都推薦使用這種命令格式。

大多數情況下,CMD 需要互動式的 shell,例如 bash、Python 或 Perl。例如,CMD ["perl", "-de0"]CMD ["python"]CMD ["php", "-a"]。CMD 採用這種形式時,意味著當你執行類似 docker run -it python 這樣的命令時可以直接進入到一個可用的 shell。除非您和您的預期使用者已經非常熟悉 ENTRYPOINT 的工作方式,否則 CMD 應該很少以 CMD ["param", "param"] 和 ENTRYPOINT 的方式使用。

EXPOSE

EXPOSE 指令指示開啟容器的哪個埠來監聽連線。應該為應用程式使用通用的傳統埠。例如,包含 Apache Web 伺服器的映象將使用EXPOSE 80,而包含 MongoDB 的映像將使用 EXPOSE 27017 等。

為了使外部可以訪問,使用者可以在執行 docker run 命令時使用標誌將容器的某個埠對映到使用者選擇的埠。對於容器連結,Docker 為從服務容器返回到源的路徑(即 MYSQL_PORT_3306_TCP)提供環境變數。(原文:For container linking, Docker provides environment variables for the path from the recipient container back to the source (ie, MYSQL_PORT_3306_TCP).)

ENV

要讓新軟體更容易執行,可以使用 ENV 來更新容器中安裝的軟體的 PATH 環境變數。例如,ENV PATH /usr/local/nginx/bin:$PATH 可以確保 CMD ["nginx"] 正常工作。

通過 ENV 指令可以提供所需的環境變數,指示服務按照預期執行,例如 Postgres 的 PGDATA 環境變數。

最後,ENV 還可用於設定常用的版本號,使版本更容易維護,例如下面的例子:

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && …
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

跟程式中的常量(而不是硬編碼值)類似,此方法可讓你更改單個 ENV 指令,以自動的地處理容器中的軟體版本。

跟 RUN 命令一樣,每個 ENV 行會建立一個新的中間層。這意味著即使在後面的層中 unset 環境變數,這個值仍然會持久化在這個層中,其值可能會丟棄。可以通過建立類似下面的 Dockerfile 並且構建映象來測試一下:

FROM alpine
ENV ADMIN_USER="mark"
RUN echo $ADMIN_USER > ./mark
RUN unset ADMIN_USER
CMD sh
$ docker run --rm -it test sh echo $ADMIN_USER

mark

在同一個層中使用帶 shell 命令的 RUN 命令來 set、use 和 unset 變數可以避免這種情況,並且確保徹底 unset 環境變數。可以通過分號 ;&& 來分隔命令。使用 && 時,任何一個命令執行失敗都會導致映象構建失敗。這是個好主意。使用反斜線 \ 作為行繼續符號,可以提高 Linux 中 Dockerfile 的可讀性。可以把所有的命令放入一個 shell 指令碼中,通過 RUN 命令直接執行這個指令碼。

FROM alpine
RUN export ADMIN_USER="mark" \
    && echo $ADMIN_USER > ./mark \
    && unset ADMIN_USER
CMD sh
$ docker run --rm -it test sh echo $ADMIN_USER

ADD or COPY

ADD 和 COPY 在功能上相似,通常來說優先使用 COPY。因為 COPY 比 ADD 更加清晰。COPY 只支援將本地檔案複製到容器,而 ADD 有好幾個不能一下子區分出來的特性(像只支援本地的 tar 檔案提取,遠端 URL 支援)。因此,ADD 的最佳用途是將本地 tar 檔案自動提取到映象中,如 ADD rootfs.tar.xz /

如果 Dockerfile 中有多個步驟使用了上下文中的不同檔案,挨個使用 COPY 命令,而不是一次全部完成。這可確保每個步驟的構建快取僅在特定的所需檔案發生更改時才會失效(強制重新執行該步驟)。

示例:

COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/

上面的例子中,相比使用 COPY . /tmp/,用於 RUN 這一步的快取更加不容易失效。

因為映象大小的考慮,非常不建議通過 ADD 從遠端 URL 獲取包,可以使用 curl 或 wget 來代替,這樣可以刪除在解壓縮後不再需要的檔案,並且不必在映象中新增其他層。例如,避免使用下面的例子

ADD http://example.com/big.tar.xz /usr/src/things/
RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things
RUN make -C /usr/src/things all

相反,使用這個例子:

RUN mkdir -p /usr/src/things \
    && curl -SL http://example.com/big.tar.xz \
    | tar -xJC /usr/src/things \
    && make -C /usr/src/things all

對於其他不需要 ADD 的 tar 檔案自動解壓縮功能的時候,儘量使用 COPY。

ENTRYPOINT

ENTRYPOINT 指令的最佳用途是設定映象的主命令,允許該映象像該命令一樣執行(然後使用 CMD 作為預設標誌)。

下面的映象,ENTRYPOINT 設定為命令列工具 s3cmd:

ENTRYPOINT ["s3cmd"]
CMD ["--help"]

現在要檢視命令的幫助可以這樣執行:

$ docker run s3cmd

或使用正確的引數來執行一次命令:

$ docker run s3cmd ls s3://mybucket

這很有用,因為如上面的命令所示,映象名稱可以作為對二進位制檔案的二次引用。

ENTRYPOINT 指令也可以與輔助指令碼結合使用,即使啟動工具可能需要多個步驟,也可以使其與上述命令類似(封裝到了指令碼中)。

例如,Postgres 官方映象 使用下面的指令碼作為其 ENTRYPOINT:

#!/bin/bash
set -e

if [ "$1" = 'postgres' ]; then
    chown -R postgres "$PGDATA"

    if [ -z "$(ls -A "$PGDATA")" ]; then
        gosu postgres initdb
    fi

    exec gosu postgres "[email protected]"
fi

exec "[email protected]"

注意:這個指令碼使用了 exec 這個 Bash 命令,因此最終執行的應用程式稱為容器的 PID 1。這會允許應用程式接受任何傳送到容器的 Unix 訊號。更多資訊參考 ENTRYPOINT

輔助指令碼被複制到容器中,並且在容器啟動時通過 ENTRYPOINT 執行:

COPY ./docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]

這個指令碼允許使用者使用多種方式同 Postgres 互動。

可以簡單的啟動 Postgres:

$ docker run postgres

或者用來執行 Postgres 並且向伺服器傳引數:

$ docker run postgres postgres --help

最後,還可以用來開啟完全不同的工具,比如 Bash:

$ docker run --rm -it postgres bash

VOLUME

VOLUME 指令應該用來暴露資料庫儲存區域、配置儲存或 docker 容器建立的檔案及資料夾。強烈建議將 VOLUME 用於映象的任何可變部分和使用者可用部分。

USER

如果服務執行時不需要特權,使用 USER 指令切換為非 root 使用者。在 Dockerfile 中通過類似 RUN groupadd -r postgres && useradd --no-log-init -r -g postgres postgres 的命令建立使用者和使用者組。

注意:映象中的使用者和使用者組會得到非確定性的 UID/GID,因為不管映象如何重建,“下一個”UID/GID 都會被分配。 所以,如果 UID/GID 很關鍵,就必須明確指定。

注意:由於 Go archive/tar 包處理稀疏檔案(sparse files)時存在 未解決的錯誤,試圖在 Docker 容器內建立具有足夠大UID的使用者可能導致磁碟耗盡,因為容器層中的 /var/log/faillog 檔案會填滿 NUL(\0)字元。 將 --no-log-init 標誌傳遞給 useradd 可以解決此問題。 Debian/Ubuntu 的 adduser 不支援 --no-log-init 標誌。

避免安裝或使用 sudo,因為它具有可能導致問題的不可預知的 TTY 和訊號轉發行為。 如果需要與 sudo 類似的功能,例如以 root 身份初始化守護程式,但將其作為非 root 使用者執行),請考慮使用 gosu

最後,為了減少層數和複雜性,避免頻繁切換 USER。

WORKDIR

應該始終為 WORKDIR 使用絕對路徑來保證清晰可靠。另外,應該使用 WORKDIR 而不是像 RUN CD ... && do-something 這樣的繁瑣指令,這些指令很難讀懂、排除故障和維護。

ONBUILD

ONBUILD 指令在所在的 Dockerfile 構建完成後執行。ONBUILD 在從當前映象派生的任何子映象中執行。可以將 ONBUILD 命令看作父 Dockerfile 給子 Dockerfile 的指令。

Docker 構建時會在執行子 Dockerfile 的任何命令之前執行 ONBUILD 命令。

ONBUILD 命令在從指定映象構建新映象時很有用。例如,可以為語言堆疊映象使用 ONBUILD,在 Dockerfile 中使用該語言編寫任意使用者軟體,就像在 Ruby 的 ONBUILD 變體中看到的一樣。

從 ONBUILD 構建的映象應該有一個獨立的標籤,例如:ruby:1.9-onbuildruby:2.0-onbuild

在 ONBUILD 中使用 ADD 或 COPY 時需要小心。如果新構建的上下文缺少所需資源,或導致 ONBUILD 的映象構建失敗。按照上面的建議新增一個單獨的標籤,通過允許 Dockerfile 作者做出選擇可以幫助緩解這種情況。

3. 官方倉庫示例

這些官方倉庫具有示例性 Dockerfiles:

4. 附加資源

相關推薦

Docker 開發應用

原文地址 Docker 可以通過從 Dockerfile 中讀取指令來自動構建映象,Dockerfile 是一個文字檔案,其中包含了按順序排列的構建指定映象所需的全部命令。Dockerfiles 採用特殊格式,使用一系列特別的指令。可以在 Dockerfile

Eclipse開發IBM Bluemix應用程序

col 1.5 技術 buildpack 準備 uem 沒有 online warp 林炳文Evankaka原創作品。轉載請註明出處http://blog.csdn.net/evankaka 摘要:本文主要解說了怎樣使用安裝Eclipse

FastDfs從一步步搭建到開發應用傳,下載,刪除

三、特別注意在下載的時候要在nginx中設定attachment-原檔案的名稱,這樣在下載下來後還是儲存時的名字,而且在下載的時候  也不會直接就在瀏覽器中開啟檔案不能下載,還有就是在下載的時候注意編碼格式才不至於出現下載的名稱亂碼, 四,這個要實現要在ng

Docker環境開發一個Java 8 Spring Boot應用程式

本文旨在讓你瞭解:在你的機器上,不需要Java 8的情況下如何建立一個Java應用程式。就像Python的虛擬環境一樣,那麼這裡我們可以使用Docker。 Python開發人員使用的虛擬環境,用於為不同的專案建立和管理獨立的環境,每個使用不同版本的Python

OS X 使用.NET開發應用程式

MonoMac是面向Mac OSX API的C#繫結,其API設計主要受到了MonoTouch的啟發,後者可以基於Mono開發原生的iOS應用程式。MonoMac套件的目標之一,也是釋出獨立的 .app應用程式,讓終端使用者擺脫對Mono的依賴。MonoTouch的成功則是一個良好的基礎,於是Mono開始將C

Docker compose開發應用

一.通過容器部署一個WordPress 1.wordpress組成 前端軟體 資料庫儲存 2.操作流程 建立mysql的containerdocker run -d --name mysql -v mysql-data:/var/lib/mys

iOS開發應用上架必讀最新蘋果稽核規則(史最全版)

http://blog.csdn.net/zc639143029/article/details/51234645 學習交流及技術討論可新浪微博關注:極客James 1. 條款和條件  • 1.1 為App Store開發程式,開發者必須遵守 Program Li

如何在OS X 10.7開發一個簡單的應用教程(二)

     原創譯文,歡迎轉載,分享 .請註明出處:http://blog.csdn.net/yuan_will/article/details/46912665 本教程由iOS Tutorial Team成員釋出,他是一位Mac和iOS開發者,的創始人。 本教

tiny4412應用程式開發示例

1、建立目錄 在這開始之前,我們先建立一個 qtopia2_apps 目錄,用於專門存放我們自已編寫的 qtopia2.2.0 程式,  在 Linux 終端中鍵入以下命令建立該目錄: [[email protected] ~]# mkdir -p /opt/q

如何在Ubuntu開發Qt應用並部署到Android裝置中

相信很多Qt開發者很想把自己的Qt應用部署到Android裝置上。今天,我試了一下,雖然經歷過一些曲折,但是最終還是把應用部署到我的手機中了。在這裡,我把我的安裝的步驟寫下來,希望對有些開發者有所幫助。1) 安裝Qt SDK開發者可以到Qt的官方網站http://downlo

Spring Boot 在Netty開發WebSocket和HTTP應用之二 -- 多個HTTP Handler(含傳和下載)處理鏈

接上篇。 因業務需要,在一個埠開啟普通的HTTP(S)服務,配合客戶端實現使用者登入驗證,使用者檔案上傳、檔案下載等功能。 在Netty中的處理方式如下: 處理鏈初始化如下,注意途中紅色方框處內容的順序。 接下來是NETTY封裝檔案的下載處理。注意下

Android開發——應用寶推廣渠道出現MD5值重複,請勿重複

起因 開發的小夥伴們,肯定遇到過運營的同學需要我們提供不同的推廣渠道apk包。但是由於一些人為操作失誤,會出現根據apk檔案MD5值判斷,該檔案已經上傳過了,請勿重複上傳。 問題的出現 這是運

撥開迷霧|嵌入式Linux應用程式開發只有高手才能完成?

好訊息:新年大促!《微控制器與嵌入式系統應用》2017全年電子刊合集僅售29.9!歡迎大家進入嵌

Linux下利用NFS和Samba在source insight快速開發應用程式

首先,在搭建這個環境之前,我們需要了解一下NFS-samba-tftp之間的區別,這個很多做嵌入式移植的朋友應該是再熟悉不過了。不過很少有人深究他們到底有什麼區別?這裡我也不講深入的本質,簡單的區別一下他們。這裡我就引用一下網上一些文章吧。 NFS是SUN Microsys

使用docker compose在EOS本地Testnet開發

god 如何 技術 o-c gen pub table download 核心 EOS區塊鏈的開發並不是立竿見影的,因為需要一些非顯而易見的組件,需要對它們進行配置和協同工作。 nodeos:塊生成器守護程序。 keosd:錢包守護進程,存儲私鑰。 eosio-cpp:智

本地Docker Jenkins構建dotnet core web應用到Linux伺服器 Docker

1、準備工作 環境 本地: Windows、Docker 程式碼倉庫:Git 伺服器:Linux、Docker 前提準備 建立個有dockerfile檔案的dotnet core 3 web專案 新建一個dotnet 3.0的web專案,在專案資料夾新增Dockerfile檔案,內容如下: FROM

小程序粉墨登場 --奉開發教程及書籍合集

是不是 網易 機器 ive cab 好書推薦 教育 pro ini 微信小程序,簡稱CX,是一種不需要下載安裝即可使用的應用,它實現了應用“觸手可及”的夢想,用戶掃一掃或搜一下即可打開應用。 小程序處於內測階段。全面開放申請後,主體類型為個人、企業

面面觀 | docker開發,修改環境變量啟動jetty

from 官網 ons 啟動 好的 step config alt project 01 本地測試docker程序 遇到問題:Docker程序使用系統的環境變量啟動的。 新智雲官網www.enncloud.cn 在服務器運行的時候是可以的,但是在本地啟動的時候就補行了。

qt-qml移動開發之在ios開發和部署app流程簡單介紹

mod target auto 100% rda 自己 color ans ora qt5.3已經全面支持移動開發,除了mac,windows,linux。還支持ios,android,wp,meego等移動平臺,本教程是作者依據自己的經驗,從頭講怎麽樣在ios上公布

Visual Studio開發Python六大功能

以及 images 工作 目標 tel 增加 工具 studio -1 Visual Studio上開發Python六大功能 一、整合 Python 直譯器 (Interpreter) & 互動視窗 (Interactive) Visual Studio 高度