Es ist erforderlich, verschiedene abhängige Bibliotheken in der C-Sprachentwicklungsumgebung zu installieren. Daher ist es schwierig, die Umgebung jedes Entwicklers zu vereinheitlichen. Bis jetzt, um die Umwelt zu vereinheitlichen
Ich musste so etwas tun. Aber jetzt gibt es eine bequeme Sache, die als Container bezeichnet wird. Der Autor hat auch eine Entwicklungs- und Testumgebung für AWS EC2 erstellt und Entwicklern zur Verfügung gestellt. Derzeit bieten wir Docker-Dateien und Docker-Images an. Hier erstellen wir eine Docker-Datei und ein Bild und erklären deren Verwendung.
Eine Umgebung, in der der Docker-Container ausgeführt wird, z. B. Docker für Mac / Windows, muss installiert sein. Außerdem sind einige Kenntnisse in Docker und Linux erforderlich. Darüber hinaus beschreibt dieser Artikel den Arbeitsinhalt auf dem Mac. Wenn Sie unter Windows arbeiten, lesen Sie bitte den entsprechenden Pfad usw.
In diesem Artikel können Sie unter CentOS des Docker-Containers Folgendes ausführen:
Die Docker-Datei ist eine Entwurfszeichnung zum Erstellen eines Containerbilds. Bevor ich den Container verwenden konnte, musste ich das Betriebssystem und die Bibliotheken manuell installieren. Wenn Sie die Prozedur in die Docker-Datei schreiben, anstatt sie aufzuschreiben, können Sie sie problemlos reproduzieren. Dies ist genau der erste Schritt in ** Infrastruktur als Code (IaC) **.
Entscheiden Sie zunächst, wo das Bild erstellt werden soll. Erstellen / platzieren Sie dort eine Docker-Datei.
> cd ~/docker/
Dockerfile
Die fertige Version stammt von hier (Dockerfile) Ich werde verschiedene Dinge in der Docker-Datei beschreiben.
Bitte wählen Sie Ihr Lieblingsbetriebssystem. Hier wird CentOS 7 als Entwicklungsumgebung ausgewählt.
From centos:7
Geben Sie das Verzeichnis an, in dem Sie installieren möchten.
WORKDIR /root
Installieren Sie Ihr Lieblingspaket mit yum. Wenn Sie in C-Sprache entwickeln, ist die Gruppeninstallation von yum praktisch. Das Bild wird größer, aber in der Entwicklungsumgebung kein Problem.
RUN yum -y update && \
yum -y groupinstall "Development Tools"
Andere sind frei! Hier (Dockerfile) beschreibt diejenigen, die wahrscheinlich normal verwendet werden.
Importieren Sie Dateien aus dem Dateisystem des Host-PCs in das Image.
COPY .bashrc /root/
Dieses Mal möchte ich die Umgebungsvariablen festlegen, wenn die Shell ausgeführt wird, daher habe ich dem Bild .bashrc hinzugefügt. Ich werde. Wenn Sie die Dateien haben, die Sie benötigen KOPIEREN [Datei auf dem Host-PC] [Speicherort im Docker-Image] Bitte hinzufügen mit.
Wechseln Sie in das Verzeichnis mit der Docker-Datei (hier ~ / docker /) und erstellen Sie.
> cd ~/docker/
> docker build -t c_dev_env .
Es wird einige Zeit in Anspruch nehmen.
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
c_dev_env latest aa8cc7f4372f About an hour ago 1.45GB
Dies vervollständigt das Docker-Image "c_dev_env".
Referenz Um sich bei DockerHub zu registrieren (Push), muss dem Tag [Organisation] hinzugefügt werden (Option -t).
docker build -t [organization]/c_dev_env .
Dies ist der wichtigste Teil dieses Artikels. Der Befehl gdb verwendet Systemaufrufe und kann ohne die entsprechenden Optionen nicht ausgeführt werden.
docker run -it --name "my_dev_env" --cap-add=SYS_PTRACE --security-opt="seccomp=unconfined" c_dev_env /bin/bash
** Erläuterung der Optionen und Parameter **
Optionen / Parameter | Erläuterung |
---|---|
-i | (--interactive)benutze stdin |
-t | Aktivieren Sie tty |
--name | Gib einen Namen. Hier"my_dev_env" |
--cap-add=SYS_PTRACE | Linux Capability ptrace()Systemaufrufe zulassen.(Referenz) Manpage der Funktionen |
--security-opt="seccomp=unconfined" | Vermeiden Sie dies, da Systemaufrufe auch mit dem als seccomp bezeichneten Mechanismus eingeschränkt sind.(Referenz)Steuern Sie Docker-Systemaufrufe mithilfe des seccomp-Profils |
Parameter 1 | Bildname. Hier c_dev_Geben Sie env an |
Parameter 2 | Ausführungsbefehl. Hier/bin/Geben Sie bash an |
-v [Host-PC-Verzeichnis]: Es ist praktisch, es in [Container-Verzeichnis] zu mounten. Sie können mit einem vertrauten Editor auf dem Host-PC entwickeln.
> docker run -it --name "my_dev_env" --cap-add=SYS_PTRACE --security-opt="seccomp=unconfined" c_dev /bin/bash
bash-4.2# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
bash-4.2#
Die Ausführungsumgebung ist jetzt abgeschlossen.
Jetzt erstellen wir ein einfaches Programm und führen es aus. Im Docker-Image unter / root / sample
bash-4.2# cd /root
bash-4.2# mkdir sample
bash-4.2# cd sample
bash-4.2# vi hello.c
Programmerstellung hello.c
hello.c
#include <stdio.h>
int main(void)
{
int sum = 0;
sum++;
printf("Hello, World!\n");
printf("sum = %d\n", sum );
return 0;
}
Und kompilieren
gcc -g -o hello hello.c
-g: Vergiss die Debug-Optionen nicht!
bash-4.2# gcc -g -o hello hello.c
bash-4.2# ls -la
total 24
drwxr-xr-x 2 root root 4096 Jun 23 14:24 .
dr-xr-x--- 1 root root 4096 Jun 23 14:23 ..
-rwxr-xr-x 1 root root 9528 Jun 23 14:24 hello
-rw-r--r-- 1 root root 136 Jun 23 14:24 hello.c
bash-4.2# ./hello
Hello, World!
sum = 1
Ich kann es richtig machen.
Jetzt debuggen wir mit gdb
bash-4.2# gdb hello
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-114.el7
~ Ausgelassen ~
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/sample/hello...done.
(gdb)
Die Eingabeaufforderung wurde ohne Fehler ausgegeben. Setzen Sie als nächstes einen Haltepunkt und führen Sie einen Schritt aus
(gdb) l <---Listenanzeige
1 #include <stdio.h>
2
3 int main(void)
4 {
5 int sum = 0;
6 sum++;
7 printf("Hello, World!\n");
8 printf("sum = %d\n", sum );
9 return 0;
10 }
(gdb) b 6 <---Haltepunkteinstellung in Zeile 6
Breakpoint 1 at 0x40056c: file hello.c, line 6.
(gdb) r <---Lauf
Starting program: /root/sample/hello
Breakpoint 1, main () at hello.c:6
6 sum++; <---An einem Haltepunkt angehalten!
Missing separate debuginfos, use: debuginfo-install glibc-2.17-260.el7_6.5.x86_64
(gdb) n <---Schrittausführung
7 printf("Hello, World!\n");
(gdb) p sum <---Variable Inhaltsanzeige
$2 = 1
Die Haltepunkteinstellung und die Schrittausführung erfolgen problemlos.
Schließlich Strg + p, Strg + q, um Linux im Docker-Container zu verlassen. Wenn Sie erneut eine Verbindung herstellen, hängen Sie Docker [Tag-Name] an
> docker attach my_dev_env
bash-4.2#
** Infrastruktur als Code (IaC) ** ist ein wesentliches technisches Element für die Erstellung umfangreicher Systemumgebungen, insbesondere in öffentlichen Clouds und Container-Orchestrierungsumgebungen. Ich war jedoch ein wenig beeindruckt, dass ich es auch in einer so vertrauten Umgebung erleben konnte. (Es ist natürlich)
--Schreiben Sie den Installationsvorgang in Dockerfile
Dies ist auch ein wichtiges Element von ** Infrastruktur als Code (IaC) **, und dies allein Toyle ( SRE Site Reliability Engineering Kapitel 5) Ich bin der Meinung, dass wir es definitiv reduzieren können. Seien Sie jedoch vorsichtig bei der Personalisierung durch Dockerfile-Handwerker und Playbook-Handwerker.
Recommended Posts