Oh MyUtils

Docker Run to Compose - Docker कमांड को Compose YAML में बदलें ऑनलाइन

docker run कमांड को docker-compose.yml प्रारूप में बदलें। पोर्ट, वॉल्यूम, एनवायरनमेंट वेरिएबल और 30+ Docker फ्लैग को तुरंत पार्स करें — 100% क्लाइंट-साइड, आपका डेटा कभी आपके ब्राउज़र से बाहर नहीं जाता।

अक्सर पूछे जाने वाले प्रश्न

Docker Run to Compose कनवर्टर क्या है?

Docker Run to Compose कनवर्टर एक उपकरण है जो docker run CLI कमांड को docker-compose.yml (Docker Compose) YAML कॉन्फ़िगरेशन फ़ाइलों में बदलता है। जब आप docker run -d --name nginx -p 80:80 nginx:latest जैसे कमांड से कंटेनर चलाते हैं, तो कनवर्टर services, ports, volumes और अन्य निर्देशों के साथ समकक्ष Compose YAML उत्पन्न करता है। यह उपयोगी है क्योंकि Compose फ़ाइलें संस्करण-नियंत्रित, पुनरुत्पादन योग्य हैं और मल्टी-कंटेनर अनुप्रयोगों को प्रबंधित कर सकती हैं।

इस Docker Run to Compose कनवर्टर का उपयोग कैसे करें?

इनपुट क्षेत्र में अपना docker run कमांड पेस्ट करें (docker run उपसर्ग के साथ या बिना)। रूपांतरण आपके टाइप करते समय स्वचालित रूप से रियल-टाइम में होता है। आउटपुट क्षेत्र में उत्पन्न docker-compose.yml YAML की समीक्षा करें। आवश्यकतानुसार विकल्प समायोजित करें: Compose संस्करण (Latest, v3.x, या v2.x) और इंडेंटेशन (2 या 4 स्पेस) चुनें। YAML को क्लिपबोर्ड पर कॉपी करने के लिए कॉपी बटन पर क्लिक करें, या docker-compose.yml फ़ाइल के रूप में सहेजने के लिए डाउनलोड करें।

क्या मेरा डेटा सुरक्षित है? क्या यह सर्वर को भेजा जाता है?

आपका डेटा 100% सुरक्षित है और कभी आपके ब्राउज़र से बाहर नहीं जाता। सभी पार्सिंग और रूपांतरण पूरी तरह से आपके डिवाइस पर चलने वाले क्लाइंट-साइड JavaScript में होता है। कोई भी Docker कमांड, एनवायरनमेंट वेरिएबल, पासवर्ड, API कुंजी या कोई अन्य डेटा किसी भी सर्वर को प्रेषित नहीं किया जाता। आप इंटरनेट डिस्कनेक्ट करके इसकी पुष्टि कर सकते हैं — प्रारंभिक पेज लोड के बाद टूल पूरी तरह से ऑफ़लाइन काम करता है।

कौन से docker run फ्लैग समर्थित हैं?

यह कनवर्टर 30 से अधिक सामान्य Docker run फ्लैग का समर्थन करता है जिसमें शामिल हैं: पोर्ट मैपिंग (-p), वॉल्यूम (-v, --mount), एनवायरनमेंट वेरिएबल (-e, --env-file), कंटेनर नाम (--name), रीस्टार्ट पॉलिसी (--restart), नेटवर्क (--network), वर्किंग डायरेक्टरी (-w), यूज़र (-u), होस्टनेम (-h), एंट्रीपॉइंट (--entrypoint), लेबल (-l), कैपेबिलिटीज़ (--cap-add, --cap-drop), प्रिविलेज्ड मोड (--privileged), डिवाइस (--device), लॉगिंग, रिसोर्स लिमिट्स (--memory, --cpus), हेल्थ चेक और बहुत कुछ।

Docker Compose संस्करणों (v2, v3, latest) में क्या अंतर है?

Docker Compose कई विनिर्देश संस्करणों से गुजरा है। संस्करण 2.x ने services, networks और volumes को शीर्ष-स्तरीय कुंजियों के रूप में पेश किया और संसाधन बाधाओं के लिए mem_limit जैसी कुंजियों का उपयोग करता है। संस्करण 3.x Docker Swarm संगतता के लिए डिज़ाइन किया गया था और संसाधन सीमाओं को deploy.resources के अंतर्गत ले जाता है। Latest (Common Specification) आधुनिक प्रारूप है जो version फ़ील्ड को पूरी तरह से छोड़ देता है। अधिकांश नई परियोजनाओं के लिए Latest का उपयोग करें।

क्या मैं बैकस्लैश वाले मल्टी-लाइन docker run कमांड पेस्ट कर सकता हूँ?

हाँ, कनवर्टर बैकस्लैश (\) लाइन कंटिन्यूएशन वाले मल्टी-लाइन कमांड का पूरी तरह से समर्थन करता है। टूल रूपांतरण से पहले इन्हें स्वचालित रूप से एकल कमांड में सामान्यीकृत करता है। बस मल्टी-लाइन कमांड को जैसा है वैसा पेस्ट करें।

मेरा रूपांतरित आउटपुट अपेक्षा से अलग क्यों दिखता है?

सामान्य कारणों में शामिल हैं: (1) फ्लैग क्रम — Compose YAML में मानक कुंजी क्रम होता है जो आपके कमांड में फ्लैग क्रम से भिन्न हो सकता है। (2) अंतर्निहित डिफ़ॉल्ट — -d (detached) जैसे कुछ फ्लैग Compose में डिफ़ॉल्ट हैं और स्पष्ट रूप से प्रकट नहीं हो सकते। (3) संस्करण अंतर — संसाधन सीमाएँ (--memory, --cpus) v2 बनाम v3 Compose प्रारूप में अलग-अलग दर्शाई जाती हैं। (4) असमर्थित फ्लैग — --rm जैसे कुछ फ्लैग का Compose में कोई सीधा समकक्ष नहीं है।

कोड उदाहरण

// Docker Run to Docker Compose converter
// Parses docker run command and generates docker-compose.yml YAML

function parseDockerRun(command) {
  const normalized = command.replace(/\\\s*\n/g, ' ').trim();
  const stripped = normalized.replace(/^docker\s+run\s+/, '');
  const tokens = tokenize(stripped);

  const options = {
    image: '', name: '', ports: [], volumes: [],
    envVars: [], network: '', restart: '',
    workdir: '', hostname: '', command: [],
    detach: false, privileged: false,
  };

  let i = 0;
  while (i < tokens.length) {
    const token = tokens[i];
    if (token === '-p' || token === '--publish') {
      const val = tokens[++i];
      const parts = val.split(':');
      options.ports.push({ host: parts[0], container: parts.slice(1).join(':') });
    } else if (token === '-v' || token === '--volume') {
      const val = tokens[++i];
      const parts = val.split(':');
      options.volumes.push({ host: parts[0], container: parts[1], mode: parts[2] || '' });
    } else if (token === '-e' || token === '--env') {
      const val = tokens[++i];
      const eq = val.indexOf('=');
      options.envVars.push({ key: val.substring(0, eq), value: val.substring(eq + 1) });
    } else if (token === '--name') { options.name = tokens[++i]; }
    else if (token === '--restart') { options.restart = tokens[++i]; }
    else if (token === '--network') { options.network = tokens[++i]; }
    else if (token === '-d') { options.detach = true; }
    else if (!token.startsWith('-')) {
      options.image = token;
      options.command = tokens.slice(i + 1);
      break;
    }
    i++;
  }
  return options;
}

function tokenize(input) {
  const tokens = [];
  let current = '', inSQ = false, inDQ = false;
  for (const char of input) {
    if (char === "'" && !inDQ) { inSQ = !inSQ; }
    else if (char === '"' && !inSQ) { inDQ = !inDQ; }
    else if (char === ' ' && !inSQ && !inDQ) {
      if (current) { tokens.push(current); current = ''; }
    } else { current += char; }
  }
  if (current) tokens.push(current);
  return tokens;
}

function generateComposeYaml(options, indent = 2) {
  const pad = ' '.repeat(indent);
  const p2 = pad.repeat(2), p3 = pad.repeat(3);
  const name = options.name || options.image.split('/').pop().split(':')[0] || 'app';
  let yaml = `services:\n${pad}${name}:\n${p2}image: ${options.image}\n`;
  if (options.name) yaml += `${p2}container_name: ${options.name}\n`;
  if (options.restart) yaml += `${p2}restart: ${options.restart}\n`;
  if (options.ports.length > 0) {
    yaml += `${p2}ports:\n`;
    options.ports.forEach(p => yaml += `${p3}- "${p.host}:${p.container}"\n`);
  }
  if (options.volumes.length > 0) {
    yaml += `${p2}volumes:\n`;
    options.volumes.forEach(v => {
      const mode = v.mode ? `:${v.mode}` : '';
      yaml += `${p3}- ${v.host}:${v.container}${mode}\n`;
    });
  }
  if (options.envVars.length > 0) {
    yaml += `${p2}environment:\n`;
    options.envVars.forEach(e => yaml += `${p3}- ${e.key}=${e.value}\n`);
  }
  if (options.network) {
    yaml += `${p2}networks:\n${p3}- ${options.network}\n`;
  }
  return yaml;
}

// Example usage
const cmd = 'docker run -d --name nginx -p 80:80 -v ./html:/usr/share/nginx/html nginx:latest';
const opts = parseDockerRun(cmd);
console.log(generateComposeYaml(opts));

संबंधित उपकरण