मैं डॉकर का उपयोग करने के साथ काफी नौसिखिया हूं और मैं अपने कस्टम PHP या लार्वा परियोजनाओं को चलाने के लिए स्थानीय विकास वातावरण बनाने की कोशिश कर रहा हूं।

यह मेरी फ़ोल्डर संरचना है

root-dir
- src // this is where my php / laravel code lives
-- info.php // file having phpinfo(); just to ensure that everything has set properly
- docker // this is where all containers and config settings live
-- php etc..
- docker-compose.yml

यह मेरा डॉकटर/php/डॉकरफाइल है

FROM ubuntu:18.04

ENV TERM=linux

ARG DEBIAN_FRONTEND=noninteractive

RUN apt-get update
RUN apt-get install -y curl zip unzip --no-install-recommends apt-utils ca-certificates
RUN apt-get install -y --no-install-recommends php7.2-fpm \
                       php7.2-cli \
                       php7.2-mysql \
                       php7.2-xml \
                       php7.2-curl \
                       php7.2-bcmath \
                       php7.2-bz2 \
                       php7.2-curl \
                       php7.2-zip \
                       php7.2-gd \
                       php7.2-gettext \
                       php7.2-zip \
                       php7.2-soap \
                       php7.2-odbc \
                       php7.2-json \
                       php7.2-geoip \
                       php7.2-igbinary \
                       php7.2-imagick \
                       php7.2-mbstring \
                       php7.2-msgpack \
                       php7.2-ssh2 \
                       php7.2-memcached \
                       php7.2-xdebug \
                       php7.2-intl \
                       php7.2-opcache \
                       php7.2-readline

RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
RUN apt-get clean
RUN rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /usr/share/doc/* ~/.composer


COPY php.ini /etc/php/$PHPVER/cli/php.ini
COPY php.ini /etc/php/$PHPVER/fpm/php.ini
COPY 20-xdebug.ini /etc/php/$PHPVER/cli/conf.d/20-xdebug.ini
COPY 20-xdebug.ini /etc/php/$PHPVER/fpm/conf.d/20-xdebug.ini
COPY php-fpm-startup /usr/bin/php
CMD /usr/bin/php

EXPOSE 9000

ENTRYPOINT ["/usr/bin/php"]
CMD ["--version"]

जब मैं docker-compose up -d चला रहा होता हूं तो मुझे यह त्रुटि मिलती है

ERROR: for php  Cannot start service php: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"/usr/bin/php\": permission denied": unknown

यह मेरी nginx/default.conf फ़ाइल है

server {

  listen 80 default_server;
  root /var/www/html;
  index index.html index.php;

  charset utf-8;

  location / {
    try_files $uri $uri/ /index.php?$query_string;
  }

  location = /favicon.ico { access_log off; log_not_found off; }
  location = /robots.txt { access_log off; log_not_found off; }

  access_log off;
  error_log /var/log/nginx/error.log error;

  sendfile off;

  client_max_body_size 100m;

  location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_intercept_errors off;
    fastcgi_buffer_size 16k;
    fastcgi_buffers 4 16k;
  }

  location ~ /\.ht {
    deny all;
  }
}
2
ltdev 21 जुलाई 2018, 20:27
तो आपके पास कुछ फ़ाइलें और एक त्रुटि है। लेकिन सवाल कहाँ है? क्या आप जानना चाहते हैं कि जब आप डॉकर से वर्चुअलबॉक्स वीएम का उपयोग करने के लिए स्विच करते हैं तो आपको वह त्रुटि नहीं मिलेगी? या आपको nginx से Apache में स्विच करना चाहिए या नहीं? अपनी पोस्ट में हमेशा उचित प्रश्नवाचक वाक्य शामिल करें। (यानी नहीं: "कोई विचार?", लेकिन कुछ इस तरह "मैं इस त्रुटि से छुटकारा पाने के लिए nginx को क्या बदल सकता हूं?")
 – 
Anthon
22 जुलाई 2018, 01:35

2 जवाब

उपयोगकर्ता को अपने dockerfile में जोड़ें जो आपके लिए php बाइनरी को कुछ इस तरह निष्पादित करेगा:

....
RUN ["chmod", "+x", "/usr/bin/php"]
RUN ["chmod", "+x", "-R", "/var/log"]
EXPOSE 9000
RUN useradd -ms /bin/bash admin
USER admin
ENTRYPOINT ["/usr/bin/php"]
CMD ["--version"]
0
piy26 21 जुलाई 2018, 22:53
आपका मतलब है कि कोई भी उपयोगकर्ता नाम मेरे मूल ओएस पर करेगा या मेरा?
 – 
ltdev
21 जुलाई 2018, 22:22
यह एक नया उपयोगकर्ता जोड़ देगा जिसे बाद के सभी आदेशों को विशेष रूप से ENTRYPOINT और CMD में निष्पादित किया जाएगा। आप linux.die.net/man/8/useradd
 – 
piy26
21 जुलाई 2018, 22:27
यह काम नहीं कर रहा है मुझे डर है, फिर भी वही त्रुटि हो रही है जब मैं docker-compose -up -d करने का प्रयास करता हूं
 – 
ltdev
21 जुलाई 2018, 22:29
मैंने जवाब अपडेट कर दिया है। कृपया अब जांच करें। RUN ["chmod", "+x", "/usr/bin/php"] जोड़ें। ऐसा लगता है कि आपके PHP बाइनरी को चलाने के लिए पर्याप्त अनुमति नहीं है।
 – 
piy26
21 जुलाई 2018, 22:41
मैंने आपके द्वारा बताए गए परिवर्तन किए, और कंपोज़ अप के बाद मैं docker ps चलाता हूं जो केवल nginx कंटेनर को सक्रिय दिखाता है। मैंने docker logs <nginx-cont-id> and get this 2018/07/21 19:45:40 [emerg] 1#1 चलाया है: /etc/nginx/conf.d/default.conf:25 nginx में अपस्ट्रीम "php" में होस्ट नहीं मिला : [उभरते] होस्ट /etc/nginx/conf.d/default.conf:25` में अपस्ट्रीम "php" में नहीं मिला
 – 
ltdev
21 जुलाई 2018, 22:49

आरई: चैट कॉनवो

हालाँकि आपकी चिंता में कि कंटेनर ने चलना क्यों बंद कर दिया।

यदि आपका आदेश कंटेनर को निष्पादित करना समाप्त कर देगा यदि आपका आदेश विफल हो जाता है और ट्टी मर जाता है, तो कंटेनर समाप्त हो जाएगा।

दूसरे शब्दों में यदि आपका आदेश कभी नहीं चलता या चलता और पूरा नहीं होता है, जैसा कि आपके उदाहरण में है

php -verson

वह कोड है जिसे आप चलाने का प्रयास कर रहे हैं जब वह पूरा हो जाएगा तो कंटेनर समाप्त हो जाएगा यदि आप stdout को नहीं पकड़ रहे हैं तो आप इस निष्पादन को कभी नहीं देख पाएंगे और कंटेनर समाप्त हो जाएगा जैसे कि कुछ भी नहीं हुआ।

0
Zee303 22 जुलाई 2018, 21:25
सुनिश्चित नहीं है कि मैं पूरी तरह से समझ गया हूं, लेकिन मैं PHP कंटेनर को हमेशा सक्रिय कैसे रखूं? इसलिए जब मैं कंपोज़ करता हूं तो मेरे सभी कंटेनर चलते रहते हैं
 – 
ltdev
22 जुलाई 2018, 00:49
हा हाँ डॉकटर कंटेनरों का कठिन हिस्सा है। आपकी entrypoint एक स्क्रिप्ट या कुछ और होनी चाहिए। मैं PHP का उपयोग नहीं करता, लेकिन मुझे नहीं लगता कि लोग केवल php बाइनरी को docker में चला रहे हैं, आमतौर पर आप एक nginx कंटेनर से शुरू करते हैं और nginx लॉन्च करते हैं जो आपकी php फ़ाइलों की सेवा करेगा nginx पृष्ठभूमि में चलता है और इसलिए जब तक यह क्रैश या बंद नहीं हो जाता तब तक चलता रहेगा।
 – 
Zee303
22 जुलाई 2018, 01:07
क्या आप मुझे entrypoint के लिए एक उदाहरण दे सकते हैं, यहां तक ​​कि php में भी नहीं, तो कम से कम मुझे पता है कि php में google के लिए क्या करना है? साथ ही मेरे सभी कंटेनर (nginx, php, mysql, आदि) docker-compose.yml से लॉन्च हो रहे हैं, जब मैं docker-compose up -d चलाता हूं, तो nginx पहले लॉन्च होगा, क्या यह सही है?
 – 
ltdev
22 जुलाई 2018, 01:13
क्या आपके पास PHP के लिए आपके पास डॉकर कंटेनर पर चलने वाला एक वेब/http सर्वर है? मैं अनुमान नहीं लगा रहा हूँ क्या आप nginx का उपयोग वेब/http सर्वर के रूप में या प्रॉक्सी के रूप में कर रहे हैं? यदि वेब सर्वर है, तो मेरा सुझाव है कि आप केवल एक एनजीआईएनएक्स डॉकटर कंटेनर के साथ शुरुआत करें और अपनी PHP आधारित साइट को पहले docker pull nginx:latest पर काम करने की कोशिश करें, फिर इसे चलाएं docker run -it -p9000:9000 8888:80 nginx:latest sh पहले यह काम करें, फिर डॉकटर की चिंता करें। कंपोज़ फ़ाइल का उपयोग यह सुनिश्चित करने के लिए किया जाता है कि सभी सहायक कंटेनर एक साथ चलते हैं। आपको पहले अपने कंटेनरों को काम करने की जरूरत है।
 – 
Zee303
22 जुलाई 2018, 01:21
यह कोई चैट नहीं है, न ही कोई फ़ोरम। यह गुणवत्ता वाले प्रश्नों और उत्तरों के लिए एक साइट है। यदि आप अभी तक टिप्पणी नहीं कर सकते हैं, तो इसका एक कारण है। एक बात से आपको बचना चाहिए, इसके बारे में टिप्पणियां शामिल हैं ("मैं चैट में शामिल नहीं हो सकता" और "उम्मीद है कि यह मदद करता है, यह मुश्किल है जब मैं सीधे चर्चा का हिस्सा नहीं बन सकता") (और ऐसा इसलिए नहीं है क्योंकि 5 हैं उन दो वाक्यों में व्याकरण संबंधी त्रुटियां)।
 – 
Anthon
22 जुलाई 2018, 01:30