Kopieren Sie ein Verzeichnis vom Host in ein Docker-Image

David Mbochi Njonge 20 Juni 2023
  1. Erstellen Sie eine Express-Anwendung
  2. Verwenden Sie die ADD-Anweisung
  3. Verwenden Sie die Anweisung COPY
  4. Verwenden Sie eine Alternative zur ADD-Anweisung
Kopieren Sie ein Verzeichnis vom Host in ein Docker-Image

Die Docker-Dokumentation definiert Docker als ein infrastrukturunabhängiges Tool, das Entwicklern hilft, Anwendungen auf dem schnellstmöglichen Weg zu entwickeln, auszuliefern und auszuführen.

Abgesehen von diesen Vorteilen verwenden DevOps-Entwickler Docker auch für Continuous Integration, Delivery und Deployment. Dieser Entwicklungsansatz wird normalerweise als CI/CD bezeichnet, und Entwickler verwenden Container, um Änderungen oder Funktionen für die Produktion zu entwickeln, zu testen und bereitzustellen.

Die Fehler in einer Anwendung werden in der Entwicklungsumgebung behoben. Sobald dies geschehen ist, werden Automatisierungstests in der Testumgebung ausgeführt. Schließlich wird das Image mit den neuen Änderungen für die Produktion bereitgestellt, wenn alle Tests bestanden sind.

In diesem Tutorial erfahren Sie, wie Sie ein Verzeichnis vom Hostcomputer in ein Docker-Image kopieren. Wir werden eine Expressanwendung verwenden, die eine API zurückgibt, um dies zu realisieren.

Erstellen Sie eine Express-Anwendung

Öffnen Sie Intellij IDEA. Wählen Sie Datei -> Neu -> Projekt. Wählen Sie in einem sich öffnenden Fenster auf der linken Seite Node.js und ändern Sie den Projektnamen von untitled auf employee-api. Klicken Sie abschließend auf die Schaltfläche Erstellen, um ein Projekt zu erstellen.

Um Express in unserer Anwendung zu installieren, öffnen Sie ein neues Terminalfenster auf Intellij IDEA, indem Sie Ansicht > Werkzeugfenster > Terminal auswählen und den folgenden Befehl verwenden, um Express zu installieren.

~/WebstormProjects/employee-api$ npm install express

Erstellen Sie nach der Installation von Express einen Ordner mit dem Namen main-app im Ordner employee-api. Um unsere API zu erstellen, erstellen Sie dann eine Datei namens index.js im Ordner main-app und kopieren Sie den folgenden Codezaun und fügen Sie ihn in die Datei ein.

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
    res.json(
        [{
            name: 'Bob',
            email: "bob@gmail.com"
        },
            {
                name: 'Alice',
                email: 'alice@gmail.com'
            },
        ])
})

app.listen(port, () => {
    console.log(`Example app listening on port ${port}`)
})

In dieser Datei haben wir eine Expressanwendung erstellt, die den Port 3000 verfügbar macht, und jede Anfrage an den Pfad / gibt ein Array von Mitarbeitern zurück. Wir werden diese Anwendung in allen Beispielen verwenden, die wir in den folgenden Abschnitten behandeln.

Verwenden Sie die ADD-Anweisung

Erstellen Sie eine Datei namens Dockerfile in unserem Basisordner employee-api und kopieren Sie den folgenden Code und fügen Sie ihn in die Datei ein.

FROM node:16.17.0-alpine
WORKDIR /com/employee
ADD package*.json ./
RUN npm install
ADD main-app /com/employee/main-app
CMD node main-app/index.js

Um ein benutzerdefiniertes Image unserer Anwendung zu erstellen, verwenden wir normalerweise eine Datei namens Dockerfile, wie in diesem Beispiel gezeigt. Der folgende Abschnitt definiert die Bedeutung jedes der in der Datei verwendeten Befehle. Uns geht es um den ADD-Befehl in der vorletzten Zeile.

Alle im vorherigen Codebeispiel verwendeten Befehle werden im Folgenden kurz erklärt:

  • FROM - Der erste Befehl, der in einer Dockerfile deklariert wird, und sein Hauptzweck ist es, das Basis-Image zu deklarieren, das wir zum Erstellen unseres Images verwenden werden. Beachten Sie, dass das Basis-Image aus den öffentlichen Repositories abgerufen wird.
  • WORKDIR - Legt das Arbeitsverzeichnis fest, und das Arbeitsverzeichnis wird erstellt, auch wenn wir es in den anderen Anweisungen nicht festlegen.
  • HINZUFÜGEN - Kopiert Dateien oder Ordner von der Quelle zum Ziel. Die Quelle ist normalerweise der Hostcomputer und das Ziel das Dateisystem des Containers.
  • RUN - Führt den bereitgestellten Befehl über dem vorhandenen Bild aus und gibt ein neues Bild zurück, das die Ausführungsergebnisse enthält. In diesem Fall installiert der Befehl die Abhängigkeiten auf dem aktuellen Image. Und das resultierende Bild wird mit den Abhängigkeiten ausgestattet.
  • CMD - Wenn wir einen Container hochfahren, stellt diese Anweisung die Standardwerte des Containers bereit, einschließlich ausführbarer Dateien oder einer Einstiegspunktanweisung. In diesem Fall haben wir die Shell-Form der Anweisung verwendet. Außerdem haben wir eine ausführbare Datei als Standard für unseren Container bereitgestellt.

Beachten Sie, dass wir die Anweisung ADD verwendet haben, um das Verzeichnis main-app von unserem Host-Rechner in ein neues Verzeichnis zu kopieren, das in unserem Arbeitsverzeichnis /com/employee/main-app erstellt wurde. Um dies in Aktion zu sehen, verwenden Sie den folgenden Befehl, um ein Image mit dem Tag employee-api zu erstellen.

~/WebstormProjects/employee-api$ docker build --tag employee-api:latest.

Beachten Sie die ersten fünf Anweisungen auf der Konsole, bis der Build erfolgreich ist. Stellen Sie dann sicher, dass Sie sehen können, wie die Anweisungen wie unten gezeigt ausgeführt werden.

 => [1/5] FROM docker.io/library/node:16.17.0-alpine@sha256:2c405ed42fc0fd6aacbe5730042640450e5ec030bada7617beac88f742b6997b                         0.0s
 => [internal] load build context                                                                                                                    0.1s
 => => transferring context: 137B                                                                                                                    0.0s
 => CACHED [2/5] WORKDIR /com/employee                                                                                                               0.0s
 => CACHED [3/5] ADD package*.json ./                                                                                                                0.0s
 => CACHED [4/5] RUN npm install                                                                                                                     0.0s
 => CACHED [5/5] ADD main-app /com/employee/main-app  

Die letzte Anweisung wird ausgeführt, wenn wir einen Container von unserem Image ausführen. Verwenden Sie beispielsweise den folgenden Befehl, um einen Container von unserem Image auszuführen.

~/WebstormProjects/employee-api$ docker run --name employee-service -d -p 3000:3000 employee-api:latest 

Dieser Befehl führt einen Container namens employee-service mit unserem Image employee-api im getrennten Modus -d aus und ordnet den Port -p 3000 dem Port 3000 auf dem localhost zu.

Um zu überprüfen, ob unsere Anwendung wie erwartet funktioniert, gehen Sie zu localhost:3000 (http://localhost:3000/), um die Mitarbeiterdaten abzurufen. Das Folgende ist das JSON-Array, das von der Anfrage zurückgegeben wird.

[
    {
    "name": "Bob",
    "email": "bob@gmail.com"
    },
    {
    "name": "Alice",
    "email": "alice@gmail.com"
    }
]

Verwenden Sie die Anweisung COPY

Kommentieren Sie die Anweisungen in der Datei mit dem Namen Dockerfile und kopieren Sie den folgenden Code und fügen Sie ihn nach dem Kommentar in die Datei ein.

FROM node:16.17.0-alpine
WORKDIR /com/employee
ADD package*.json ./
RUN npm install
COPY main-app /com/employee/main-app
CMD node main-app/index.js

Beachten Sie, dass diese Anweisungen mit denen im vorherigen Beispiel identisch sind. Die einzige Änderung, die wir vorgenommen haben, ist das Ersetzen der Anweisung ADD in der vorletzten Zeile durch die Anweisung COPY.

KOPIEREN - Kopiert Dateien oder Ordner von der Quelle zum Ziel. Die Quelle ist normalerweise der Hostcomputer und das Ziel das Dateisystem des Containers.

Beachten Sie, dass die COPY-Anweisung der ADD-Anweisung ähnlich ist, da sie das gleiche Ziel erreichen. Um dies in Aktion zu sehen, verwenden Sie die Befehle, die wir im vorherigen Beispiel verwendet haben, um ein Image zu erstellen und einen Container aus dem Image auszuführen.

Wir können ein neues Bild erstellen oder das vorhandene Bild neu erstellen. Um das vorhandene Image neu zu erstellen, müssen wir den laufenden Container stoppen, den Container entfernen und das Image entfernen. Verwenden Sie die folgenden Befehle, um die jeweiligen Schritte auszuführen.

~/WebstormProjects/employee-api$ docker stop employee-service 
~/WebstormProjects/employee-api$ docker rm -f employee-service 
~/WebstormProjects/employee-api$ docker rmi -f employee-api:latest 

Verwenden Sie eine Alternative zur ADD-Anweisung

Kommentieren Sie die Anweisungen in der Datei mit dem Namen Dockerfile und kopieren Sie den folgenden Code und fügen Sie ihn nach dem Kommentar in die Datei ein.

FROM node:16.17.0-alpine
WORKDIR /com/employee
ADD package*.json ./
RUN npm install
ADD . .
CMD node main-app/index.js

Beachten Sie, dass dieses Beispiel dem vorherigen Beispiel ähnlich ist und die einzige Änderung, die wir vorgenommen haben, darin besteht, die Anweisung COPY durch die Anweisung ADD zu ersetzen. Der ADD-Befehl in diesem Beispiel verwendet zwei Punkte . . um die Quelle und das Ziel anzugeben.

Es zeigt an, dass wir alle Inhalte im aktuellen Verzeichnis in das Arbeitsverzeichnis kopieren möchten. So können wir beispielsweise mit diesem Befehl den Ordner main-app und seinen Inhalt zum Arbeitsverzeichnis /com/employee in unserem Bild hinzufügen, was viel einfacher ist als die anderen Beispiele.

Wir können die Datei .dockerignore verwenden, um die Dateien und Ordner hinzuzufügen, die wir nicht zu unserem Image hinzufügen möchten. Verwenden Sie dann die Befehle, die wir in den vorherigen Beispielen verwendet haben, um ein Image zu erstellen und einen Container aus dem Image auszuführen.

Die Ausgabe ist immer noch dieselbe, da wir in unserer Express-Anwendung keinen Code geändert haben.

Wir haben also gelernt, wie man ein Verzeichnis von einem Host-Rechner in ein Dateisystem unseres Images kopiert. Wir können auch die Befehle ADD und COPY verwenden, um ein Verzeichnis in ein anderes zu kopieren.

Wir können auch die Anweisung COPY mit zwei Punkten COPY . . und es wird immer noch die gleiche Wirkung haben.

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub

Verwandter Artikel - Docker Directory