[LINUX] Créer un environnement de développement de langage C avec un conteneur

À propos de cet article

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.

supposition

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.

objectif

Dans cet article, vous pourrez effectuer les opérations suivantes sur le CentOS du conteneur Docker:

  1. Vous pouvez écrire une source en langage C avec vi
  2. Les programmes en langage C peuvent être compilés en utilisant gcc et make
  3. Le fichier exécutable compilé peut être exécuté
  4. L'exécutable compilé peut être débogué avec gdb
  5. (Bonus) java et python peuvent également être utilisés

Créer Dockerfile

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) **.

Décidez d'abord où créer l'image

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.

Image de base

Veuillez choisir votre système d'exploitation préféré. Ici, CentOS 7 est sélectionné comme environnement de développement.

From centos:7

Directeur de travail

Spécifiez le répertoire dans lequel vous souhaitez installer.

WORKDIR /root

Installation du module

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.

Importer des fichiers dans l'image

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.

Création d'image Docker

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 .

Exécution du conteneur Docker

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éation et exécution de programme

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éboguer

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.

Quittez le conteneur Docker

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#

Résumé

** 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.

Recommended Posts

Créer un environnement de développement de langage C avec un conteneur
Créez facilement un environnement de développement avec Laragon
[Django] Créez rapidement un environnement de développement de conteneur Django (Docker) avec PyCharm
[Python] Créer un environnement de développement Django avec Docker
Créer un environnement de développement Django à l'aide de Doker Toolbox
Créer un environnement d'apprentissage automatique Python avec des conteneurs
Créer un environnement de développement d'applications d'apprentissage automatique avec Python
Créez un environnement de développement avec Poetry Django Docker Pycharm
Créez un environnement de développement Django avec Docker! (Docker-compose / Django / postgreSQL / nginx)
[Memo] Construire un environnement de développement pour Django + Nuxt.js avec Docker
Créez un environnement de développement Go avec les conteneurs distants de VS Code
Créez un environnement de développement confortable avec VSCode x Remote Development x Pipenv
Comment créer un environnement de développement de la série Python2.7 avec Vagrant
Créer un environnement Tensorflow avec Raspberry Pi [2020]
Créez un environnement d'API rapide avec docker-compose
[Linux] Créer un environnement Jenkins avec Docker
Créez un environnement virtuel pour python avec pyenv
Créez un environnement Python moderne avec Neovim
[Linux] Construction de l'environnement Docker avec Amazon Linux 2
[DynamoDB] [Docker] Créer un environnement de développement pour DynamoDB et Django avec docker-compose
Créez un environnement WardPress sur AWS avec Pulumi
Créer un environnement de développement Python avec Visual Studio Code
Créez un environnement python avec ansible sur centos6
Créer un environnement de construction python3 avec Sublime Text3
Créez un environnement Django avec Vagrant en 5 minutes
Créez un environnement de développement Python sur votre Mac
[Memo] Créez un environnement virtuel avec Pyenv + anaconda
Créez un environnement virtuel avec pyenv et venv
Créer un environnement Kubernetes pour le développement sur Ubuntu
Construire un environnement Python avec OSX Elcapitan
Créez un environnement de développement de plugins Minecraft avec Eclipse
Créez rapidement un environnement Python Django avec IntelliJ
J'ai essayé de créer un environnement de développement Mac Python avec pythonz + direnv
Créer un environnement de développement mruby pour ESP32 (édition Linux)
Construire un environnement de développement Python sur Raspberry Pi
Créer un environnement d'exécution python avec VS Code
Obtenez un environnement de développement Python rapide avec Poetry
Flutter dans Docker - Comment créer et utiliser un environnement de développement Flutter dans un conteneur Docker
Créer un environnement de développement TensorFlow sur Amazon EC2 avec une copie de commande
Créez un environnement de développement local avec WSL + Docker Desktop pour Windows + docker-lambda + Python
Mettre en place un environnement de développement pour le traitement du langage naturel
Créer un environnement de développement Python basé sur GVim sur Windows 10 (3) GVim8.0 et Python3.6
Créer un environnement de développement Django à l'aide de pyenv-virtualenv sur Mac
Créez un environnement virtuel python avec virtualenv et virtualenvwrapper
Créez un environnement de développement local pour Laravel6.X sur votre Mac
Réparer un environnement de développement cassé avec la migration des non-conformistes (Remarque)
Créez un environnement python pour chaque répertoire avec pyenv-virtualenv
Créez un environnement de développement python avec vagrant + ansible + fabric
Créer un environnement de développement Python basé sur GVim sur l'installation de Windows 10 (1)
Je souhaite créer facilement un environnement de développement basé sur un modèle
Créer un environnement de développement Python sur Mac OS X
Créez un environnement virtuel python avec virtualenv et virtualenvwrapper
Comment créer un environnement de développement pour TensorFlow (1.0.0) (Mac)
Créer un environnement de développement Python à l'aide de pyenv sur MacOS
Configurer un environnement de développement Python avec Sublime Text 2
Construire un environnement Django pour Win10 (avec espace virtuel)
Créer un environnement de développement d'API rapide léger à l'aide de Docker
Construire un environnement de calcul numérique avec pyenv et miniconda3