Il est nécessaire d'installer diverses bibliothèques dépendantes dans l'environnement de développement du langage C. Par conséquent, il est difficile d'unifier l'environnement de chaque développeur. Jusqu'à présent, pour unifier l'environnement
Je devais faire quelque chose comme ça. Mais maintenant, il existe une chose pratique appelée un conteneur. L'auteur a également créé un environnement de développement et de test sur AWS EC2 et l'a fourni aux développeurs. Actuellement, nous fournissons des fichiers Docker et des images Docker. Ici, nous allons créer un Dockerfile et une image et expliquer comment les utiliser.
Un environnement dans lequel le conteneur Docker fonctionne, tel que Docker pour Mac / Windows, doit être installé. De plus, une petite connaissance de Docker et Linux est requise. En outre, cet article décrit le contenu de travail sur mac. Lorsque vous travaillez sous Windows, veuillez lire le chemin, etc., le cas échéant.
Dans cet article, vous pourrez effectuer les opérations suivantes sur le CentOS du conteneur Docker:
Le fichier docker est un dessin de conception permettant de créer une image de conteneur. Avant d'utiliser le conteneur, j'ai dû installer manuellement le système d'exploitation et les bibliothèques. Si vous écrivez la procédure dans le Dockerfile au lieu de l'écrire, vous pouvez facilement la reproduire. C'est exactement la première étape de ** Infrastructure as Code (IaC) **.
Tout d'abord, décidez où créer l'image. Créez / placez un Dockerfile ici.
> cd ~/docker/
Dockerfile
La version complète est de ici (Dockerfile) Je décrirai diverses choses dans le Dockerfile.
Veuillez choisir votre système d'exploitation préféré. Ici, CentOS 7 est sélectionné comme environnement de développement.
From centos:7
Spécifiez le répertoire dans lequel vous souhaitez installer.
WORKDIR /root
Installez votre package préféré avec yum. Si vous développez en langage C, l'installation de groupe de yum est pratique. L'image sera plus grande, mais ce ne sera pas un problème dans l'environnement de développement.
RUN yum -y update && \
yum -y groupinstall "Development Tools"
D'autres sont gratuits! Ici (Dockerfile) décrit ceux qui sont susceptibles d'être utilisés normalement.
Importez des fichiers du système de fichiers du PC hôte dans l'image.
COPY .bashrc /root/
Cette fois, je veux définir les variables d'environnement lorsque le shell est exécuté, j'ai donc ajouté .bashrc à l'image. Je vais. Si vous avez les fichiers dont vous avez besoin COPY [Fichier sur le PC hôte] [Emplacement dans l'image Docker] Veuillez ajouter avec.
Allez dans le répertoire contenant le fichier Docker (ici ~ / docker /) et compilez.
> cd ~/docker/
> docker build -t c_dev_env .
Cela prendra du temps.
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
c_dev_env latest aa8cc7f4372f About an hour ago 1.45GB
Ceci termine l'image Docker "c_dev_env".
Référence Pour s'inscrire (pousser) sur DockerHub, il est nécessaire d'ajouter [organisation] à la balise (option -t).
docker build -t [organization]/c_dev_env .
C'est la partie la plus importante de cet article. La commande gdb utilise des appels système et ne peut pas être exécutée sans les options appropriées.
docker run -it --name "my_dev_env" --cap-add=SYS_PTRACE --security-opt="seccomp=unconfined" c_dev_env /bin/bash
** Explication des options et paramètres **
Options / paramètres | La description |
---|---|
-i | (--interactive)utiliser stdin |
-t | Activer tty |
--name | Donnez un nom. ici"my_dev_env" |
--cap-add=SYS_PTRACE | Linux Capability ptrace()Autoriser les appels système.(Référence) Page de manuel des capacités |
--security-opt="seccomp=unconfined" | Puisque les appels système sont limités même avec le mécanisme appelé seccomp, évitez-le.(référence)Contrôlez les appels système du docker à l'aide du profil seccomp |
Paramètre 1 | Nom de l'image. Ici c_dev_Spécifiez env |
Paramètre 2 | Commande d'exécution. ici/bin/Spécifiez bash |
-v [Répertoire du PC hôte]: Il est pratique de le monter dans [Répertoire du conteneur]. Vous pouvez développer avec un éditeur familier sur le PC hôte.
> 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#
L'environnement d'exécution est maintenant terminé.
Créons maintenant un programme simple et exécutons-le. Dans l'image Docker sous / root / sample
bash-4.2# cd /root
bash-4.2# mkdir sample
bash-4.2# cd sample
bash-4.2# vi hello.c
Création de programme 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;
}
Et compilez
gcc -g -o hello hello.c
-g: N'oubliez pas les options de débogage!
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
Je peux le faire correctement.
Débogageons maintenant avec gdb
bash-4.2# gdb hello
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-114.el7
~ Omis ~
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /root/sample/hello...done.
(gdb)
L'invite est sortie sans aucune erreur. Ensuite, définissez un point d'arrêt et exécutez une étape
(gdb) l <---Affichage de la liste
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 <---Réglage du point d'arrêt sur la ligne 6
Breakpoint 1 at 0x40056c: file hello.c, line 6.
(gdb) r <---Courir
Starting program: /root/sample/hello
Breakpoint 1, main () at hello.c:6
6 sum++; <---Arrêté à un point de rupture!
Missing separate debuginfos, use: debuginfo-install glibc-2.17-260.el7_6.5.x86_64
(gdb) n <---Exécution par étapes
7 printf("Hello, World!\n");
(gdb) p sum <---Affichage du contenu variable
$2 = 1
La définition du point d'arrêt et l'exécution des étapes se font sans aucun problème.
Enfin, Ctrl + p, Ctrl + q pour sortir de Linux dans le conteneur Docker.
Lors de la nouvelle connexion, docker attache [nom de la balise]
> docker attach my_dev_env
bash-4.2#
** Infrastructure as Code (IaC) ** est un élément technique essentiel pour la création d'environnements système à grande échelle, en particulier dans les clouds publics et les environnements d'orchestration de conteneurs. Cependant, j'ai été un peu impressionné de pouvoir en faire l'expérience même dans un environnement aussi familier. (C'est naturel)
C'est aussi un élément important de ** Infrastructure as Code (IaC) **, et ce seul Toyle ( SRE Site Reliability Engineering Chapter 5) Je pense que nous pouvons certainement le réduire. Attention cependant à la personnalisation par les artisans Dockerfile et les artisans Playbook.