'Kaynak' ile bir Dockerfile RUN komutunu kullanmak çalışmıyor


274

Vanilya python ortamı kurmak için bir araya getirdiğim bir Dockerfile'ım var (içine bir uygulama yükleyeceğim, ancak daha sonraki bir tarihte).

FROM ubuntu:12.04

# required to build certain python libraries
RUN apt-get install python-dev -y

# install pip - canonical installation instructions from pip-installer.org
# http://www.pip-installer.org/en/latest/installing.html
ADD https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py /tmp/ez_setup.py
ADD https://raw.github.com/pypa/pip/master/contrib/get-pip.py /tmp/get-pip.py
RUN python /tmp/ez_setup.py
RUN python /tmp/get-pip.py
RUN pip install --upgrade pip 

# install and configure virtualenv
RUN pip install virtualenv 
RUN pip install virtualenvwrapper
ENV WORKON_HOME ~/.virtualenvs
RUN mkdir -p $WORKON_HOME
RUN source /usr/local/bin/virtualenvwrapper.sh

Yapı, aşağıdaki istisnayı aldığım son satıra kadar tamam çalışır:

[previous steps 1-9 removed for clarity]
...
Successfully installed virtualenvwrapper virtualenv-clone stevedore
Cleaning up...
 ---> 1fc253a8f860
Step 10 : ENV WORKON_HOME ~/.virtualenvs
 ---> Running in 8b0145d2c80d
 ---> 0f91a5d96013
Step 11 : RUN mkdir -p $WORKON_HOME
 ---> Running in 9d2552712ddf
 ---> 3a87364c7b45
Step 12 : RUN source /usr/local/bin/virtualenvwrapper.sh
 ---> Running in c13a187261ec
/bin/sh: 1: source: not found

Eğer ben lsbu dizine (sadece önceki adımların yapıldığını test etmek için) dosyaları beklendiği gibi var olduğunu görebilirsiniz:

$ docker run 3a87 ls /usr/local/bin
easy_install
easy_install-2.7
pip
pip-2.7
virtualenv
virtualenv-2.7
virtualenv-clone
virtualenvwrapper.sh
virtualenvwrapper_lazy.sh

Sadece sourcekomutu çalıştırmayı denersem yukarıdaki ile aynı 'bulunamadı' hatasını alıyorum. Ancak etkileşimli bir kabuk oturumu ÇALIŞIYORSA, kaynak çalışıyor:

$ docker run 3a87 bash
source
bash: line 1: source: filename argument required
source: usage: source filename [arguments]

Sonra mutlu erişimini buradan komut dosyasını çalıştırın ve olabilir workon, mkvirtualenvvs.

Biraz araştırma yaptık ve başlangıçta sorun arasındaki fark yalan gibi bir halleri vardı bash Ubuntu giriş kabuğu ve çizgi Ubuntu sistem kabuğu , çizgi desteklemeyen sourcekomutu.

Ancak, bunun cevabı '.' Bunun yerine source, Docker çalışma zamanının bir panik istisnasıyla patlamasına neden olur.

Bu sorunu çözmek için bir Dockerfile RUN komutundan bir kabuk komut dosyası çalıştırmanın en iyi yolu nedir (Ubuntu 12.04 LTS için varsayılan temel görüntüden kaçıyorum).


2
Yani `` kaynak '' etmeyin, sadece komutu çalıştırın. Veya özellikle kabuk komut dosyasını 'bash' ile çalıştırın.
Alister Bulman

Bunu denedim - komut dosyası başarısız olmasa da, istediğim çeşitli komutlara erişemiyorum. Bu sorun aynı şey - github.com/dotcloud/docker/issues/2847
Hugo Rodger-Brown

2
Hangi, düşünmek doğru. Virtualenvwrapper muhtemelen bir konteyner ortamında anlamsızdır. Geri alacağım ve bunun yerine 'yerli' virtualenv kullanacağım.
Hugo Rodger-Brown

1
Buna yaklaşmanın en temel yolu stackoverflow.com/questions/4732200/…
Gaurav Ojha

DeneyinCMD source activate django-py35
Belter

Yanıtlar:


315

RUN /bin/bash -c "source /usr/local/bin/virtualenvwrapper.sh"


67
Eh? Kabuk içinde yalnızca komut için var olan bir komut dosyası kaynak yaparsanız, eyleminin toplam toplamının ortam değişkenlerini ayarladığı varsayılarak, gelecekteki komutlar üzerinde kalıcı bir etkisi olamaz. Öyleyse neden kullanırsınız sourcesadece vs, hepsi de bash /usr/local/bin/virtualenvwrapper.shbu durumda?
Charles Duffy

13
RUN /bin/bash -c "source /usr/local/bin/virtualenvwrapper.sh; my_command; my_command; my_command;"
Leo

29
Çalışmasına rağmen bu doğru değil. Docs.docker.com/engine/reference/builder/#run adresini okuyun ve ikinci kod örneğinden sonra durmayın. Hemen ardından gelen Notu okuyun : /bin/sh -cVarsayılan kabuk olduğundan , RUN bu "kabuk formu" anlamına gelir RUN ["/bin/sh", "-c", "/bin/bash" "-c" "source /usr/local/bin/virtualenvwrapper.sh"]. Devam etmeli ve shRUN ["/bin/bash" "-c" "source /usr/local/bin/virtualenvwrapper.sh"]
RUN'un

8
Bunun neden bir iç içe yuva oluşturduğunu ve bu nedenle kaçınılması gerektiğini anlamak için lütfen stackoverflow.com/a/45087082/117471 adresine bakın . bashsh
Bruno Bronosky

4
Çok daha iyi bir cevap burada: stackoverflow.com/a/42216046/1663462
Chris Stryczynski

150

Orijinal Yanıt

FROM ubuntu:14.04
RUN rm /bin/sh && ln -s /bin/bash /bin/sh

Bu, her Ubuntu docker temel görüntüsü için çalışmalıdır. Bu satırı genellikle yazdığım her Dockerfile için eklerim.

İlgili bir seyirci tarafından düzenleme

" Bu Dockerdosyası boyunca kullanmak bashyerine " etkisini değiştirmek ve zararsh vermeksizin elde etmek istiyorsanızKonteyner içindeki işletim sistemini niyetinizi söyleyebilirsiniz . Bu böyle yapılır:

SHELL ["/bin/bash", "-c"]

* Olası hasar Linux'taki birçok komut dosyasının (yeni bir Ubuntu kurulumunda grep -rHInE '/bin/sh' /2700'den fazla sonuç döndürüyor) tam bir POSIX kabuğu beklemesidir /bin/sh. Bash kabuğu sadece POSIX artı ekstra yerleşik değildir. POSIX'tekinden tamamen farklı davranan yerleşimler (ve daha fazlası) vardır. Ben tam olarak POSIX (ve başka bir kabuk üzerinde test etmedi herhangi bir komut dosyası işe yaramaz çünkü işe yaramaz kaçındığını düşünüyorum) kaçınarak destek ve sadece bashism kullanarak destek. Ama bunu senaryonuzda uygun bir şeyle yaparsınız. POSIX kabuğunu tüm işletim sisteminin altından çekerek değil. (Linux ile birlikte gelen 2700 plus komut dosyasının tümünü ve yüklediğiniz paketlerin tümünü doğrulamak için zamanınız yoksa.)

Aşağıdaki bu cevapta daha fazla ayrıntı. https://stackoverflow.com/a/45087082/117471


18
Bu biraz basitleştirilebilir:ln -snf /bin/bash /bin/sh
apottere

2
@ user1442219 bu cümledeki varsayılan komut yorumlayıcı shiçinbash
Bhargav Nanekalva

27
ln -s /bin/bash /bin/shbu korkunç bir fikir. ubuntu hedefleri / bin / sh bir sebepten dolayı tire. tire, bash'den daha hızlı büyüklük sıraları olan tamamen posix bir kabuktur. / bin / sh komutunu bash'a bağlamak, sunucunuzun performansını önemli ölçüde azaltır. alıntı: wiki.ubuntu.com/DashAsBinSh
xero

7
Bu kirli bir saldırı, bir çözüm değil. Senaryonuz tarafından çalıştırılıyor ise shkabuk, ama istediğiniz bash, doğru çözüm olması ya olan shsüreç çağırma işlemi bashörneğin bir seferlik olarak bash -c 'source /script.sh && …', ya sen bile (gibi önlemek bashisms edecek kadar ileri gidebiliriz sourceyerine tamamen) ve yalnızca geçerli POSIX eşdeğerlerini kullanmayı seçin, örn . /script.sh. ( .Sonrasında , boşluğa dikkat edin !) Son olarak, betiğiniz çalıştırılabilirse (sadece kaynaklanamazsa), betiğinizi aslında sh uyumlu değilse asla bir shebang ile yalan söylemeyin #!/bin/sh. #!/bin/bashBunun yerine kullanın .
Mark G.

7
Ve şimdi orijinal cevabı nasıl indirebilirim ve 'endişe' ile düzenlemeyi nasıl onaylayabilirim?
Slava

65

RUNTalimat için varsayılan kabuk şudur ["/bin/sh", "-c"].

RUN "source file"      # translates to: RUN /bin/sh -c "source file"

SHELL talimatını kullanarak RUNDockerfile'daki sonraki talimatlar için varsayılan kabuğu değiştirebilirsiniz :

SHELL ["/bin/bash", "-c"] 

Artık varsayılan kabuk değişti ve bunu her RUN talimatında açıkça tanımlamanıza gerek yok

RUN "source file"    # now translates to: RUN /bin/bash -c "source file"

Ek Not : --loginBir giriş kabuğu başlatacak bir seçenek de ekleyebilirsiniz . Bu ~/.bachrc, örneğin okunacağı anlamına gelir ve komutunuzdan önce bunu açıkça belirtmeniz gerekmez


1
Kullanarak büyük işaretçi --login- sadece bunu kendim anladım
mattexx

1
Kullanarak SHELL ["/bin/bash", "-c", "-l"] .bashrc dosyası için asdf komutlarını kolayca çalıştırmamı sağlayan daha fazla güncelleştirme kullanabildim.
Rowinson Gallego

46

Ben de aynı sorunu vardı ve sanal kurulum içinde pip install yürütmek için bu komutu kullanmak zorunda kaldı:

RUN pip install virtualenv virtualenvwrapper
RUN mkdir -p /opt/virtualenvs
ENV WORKON_HOME /opt/virtualenvs
RUN /bin/bash -c "source /usr/local/bin/virtualenvwrapper.sh \
    && mkvirtualenv myapp \
    && workon myapp \
    && pip install -r /mycode/myapp/requirements.txt"

Umut ediyorum bu yardım eder.


ROS cevaplarından geldiyseniz, evet işe yarıyor. Gibi bir şey:RUN /bin/bash -c "source /opt/ros/melodic/setup.bash && \ cd /home && \ git clone https://angelos.p:$password@gitlab.com/inno/grpc-comms.git && \ cd grpc-comms && \ mkdir build && \ cd build && \ cmake .. && make"
angelos.p

44

En basit yol, bash sourcekomutunun sh eşdeğeri olan nokta yerine nokta operatörünü kullanmaktır :

Onun yerine:

RUN source /usr/local/bin/virtualenvwrapper.sh

kullanın:

RUN . /usr/local/bin/virtualenvwrapper.sh

"kaynak bir bourne kabuğu yerleşkesi ve bir POSIX` `özel 'yerleşik' dir - ss64.com/bash/source.html linux.die.net/man/1/sh ... . / dosya adındansource sonra konum parametrelerini de kabul eder
Wes Turner

5
Her RUN komutu bağımsız çalıştığı için bu çalışmaz. RUN komutu bittiğinde değişiklikler yapılır sourceveya .kaybolur. Bakınız: stackoverflow.com/a/40045930/19501
amit

26

Docker 1.12 veya daha yenisini kullanıyorsanız, SHELL !

Kısa cevap:

genel:

SHELL ["/bin/bash", "-c"] 

python vituralenv için:

SHELL ["/bin/bash", "-c", "source /usr/local/bin/virtualenvwrapper.sh"]

Uzun cevap:

dan https://docs.docker.com/engine/reference/builder/#/shell

SHELL ["executable", "parameters"]

SHELL komutu, komutların kabuk formu için kullanılan varsayılan kabuğun geçersiz kılınmasına izin verir. Linux'ta varsayılan kabuk ["/ bin / sh", "-c"] ve Windows'ta ["cmd", "/ S", "/ C"] şeklindedir. SHELL komutu bir Dockerfile içinde JSON biçiminde yazılmalıdır.

SHELL komutu, yaygın olarak kullanılan ve oldukça farklı iki yerel kabuğun olduğu Windows'da özellikle kullanışlıdır: cmd ve powershell ve sh dahil alternatif kabuklar mevcuttur.

SHELL komutu birden çok kez görünebilir. Her SHELL komutu önceki tüm SHELL talimatlarını geçersiz kılar ve sonraki tüm talimatları etkiler. Örneğin:

FROM microsoft/windowsservercore

# Executed as cmd /S /C echo default
RUN echo default

# Executed as cmd /S /C powershell -command Write-Host default
RUN powershell -command Write-Host default

# Executed as powershell -command Write-Host hello
SHELL ["powershell", "-command"]
RUN Write-Host hello

# Executed as cmd /S /C echo hello
SHELL ["cmd", "/S"", "/C"]
RUN echo hello

Kabuk formu bir Dockerfile içinde kullanıldığında aşağıdaki talimatlar SHELL komutundan etkilenebilir: RUN, CMD ve ENTRYPOINT.

Aşağıdaki örnek, Windows'ta bulunan ve SHELL komutu kullanılarak kolaylaştırılabilen yaygın bir kalıptır:

...
RUN powershell -command Execute-MyCmdlet -param1 "c:\foo.txt"
...

Docker tarafından çağrılan komut:

cmd /S /C powershell -command Execute-MyCmdlet -param1 "c:\foo.txt"

Bu iki nedenden dolayı verimsizdir. İlk olarak, gerekli olmayan bir cmd.exe komut işlemcisi (aka shell) çağrılıyor. İkincisi, kabuk formundaki her RUN komutu, komutun önüne ek bir powershell -command gerektirir.

Bunu daha verimli hale getirmek için, iki mekanizmadan biri kullanılabilir. Bunlardan biri RUN komutunun JSON formunu kullanmaktır:

...
RUN ["powershell", "-command", "Execute-MyCmdlet", "-param1 \"c:\\foo.txt\""]
...

JSON formu açık ve gereksiz cmd.exe kullanmıyor olsa da, çift tırnak ve kaçarak daha fazla ayrıntı gerektirir. Alternatif mekanizma, özellikle kaçış ayrıştırıcı yönergesi ile birleştirildiğinde Windows kullanıcıları için daha doğal bir sözdizimi yaparak SHELL komutunu ve kabuk formunu kullanmaktır:

# escape=`

FROM microsoft/nanoserver
SHELL ["powershell","-command"]
RUN New-Item -ItemType Directory C:\Example
ADD Execute-MyCmdlet.ps1 c:\example\
RUN c:\example\Execute-MyCmdlet -sample 'hello world'

Sonuçlanan:

PS E:\docker\build\shell> docker build -t shell .
Sending build context to Docker daemon 4.096 kB
Step 1/5 : FROM microsoft/nanoserver
 ---> 22738ff49c6d
Step 2/5 : SHELL powershell -command
 ---> Running in 6fcdb6855ae2
 ---> 6331462d4300
Removing intermediate container 6fcdb6855ae2
Step 3/5 : RUN New-Item -ItemType Directory C:\Example
 ---> Running in d0eef8386e97


    Directory: C:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       10/28/2016  11:26 AM                Example


 ---> 3f2fbf1395d9
Removing intermediate container d0eef8386e97
Step 4/5 : ADD Execute-MyCmdlet.ps1 c:\example\
 ---> a955b2621c31
Removing intermediate container b825593d39fc
Step 5/5 : RUN c:\example\Execute-MyCmdlet 'hello world'
 ---> Running in be6d8e63fe75
hello world
 ---> 8e559e9bf424
Removing intermediate container be6d8e63fe75
Successfully built 8e559e9bf424
PS E:\docker\build\shell>

SHELL komutu, bir kabuğun çalışma şeklini değiştirmek için de kullanılabilir. Örneğin, Windows'ta SHELL cmd / S / C / V: AÇIK | KAPALI kullanılarak, gecikmeli ortam değişkeni genişletme semantiği değiştirilebilir.

SHELL komutu, zsh, csh, tcsh ve diğerleri gibi alternatif bir kabuk gerektiğinde Linux'ta da kullanılabilir.

SHELL özelliği Docker 1.12'de eklendi.


20

Bu sayfadaki cevaplara dayanarak, her RUN deyiminin diğerlerinden bağımsız olarak çalıştığının /bin/sh -cve bu nedenle normalde giriş kabuklarında kaynaklanacak herhangi bir ortam değişkeninin alınmayacağının farkında olmanız gerektiğini ekleyeceğim .

Şimdiye kadar bulduğum en iyi yol betiği eklemek /etc/bash.bashrcve daha sonra her komutu bash login olarak çağırmak.

RUN echo "source /usr/local/bin/virtualenvwrapper.sh" >> /etc/bash.bashrc
RUN /bin/bash --login -c "your command"

Örneğin virtualenvwrapper'ı kurabilir ve kurabilir, sanal env'yi oluşturabilir, bir bash girişini kullandığınızda etkinleştirilmesini sağlayabilir ve daha sonra python modüllerinizi bu env'ye kurabilirsiniz:

RUN pip install virtualenv virtualenvwrapper
RUN mkdir -p /opt/virtualenvs
ENV WORKON_HOME /opt/virtualenvs
RUN echo "source /usr/local/bin/virtualenvwrapper.sh" >> /etc/bash.bashrc
RUN /bin/bash --login -c "mkvirtualenv myapp"
RUN echo "workon mpyapp" >> /etc/bash.bashrc
RUN /bin/bash --login -c "pip install ..."

Bash başlangıç ​​dosyalarındaki kılavuzu okumak, ne zaman kaynaklandığını anlamaya yardımcı olur.


1
Harika, çözümünüzü temel alarak sadece göstermek için yaptığım şuydu: ADD env-file /etc/profile.d/installerenv.sh RUN /bin/bash --login -c 'env' RUN /bin/bash -c 'rm /etc/profile.d/installerenv.sh' Birinin kullanım durumu, benim gibi docker yapı perspektifine daha fazla enjekte edilen ortam değişkenleri eklerse , docs.docker.com/compose/yml adresine göz atmanızı öneririm / # env-dosyası da.
daniel.kahlenberg

1
Bununla ilgili sorun, inanıyorum ki, her RUNkomutun sonuçlarını önbelleğe almamanızdır , bu da çok fazla proje bağımlılığı yükleyemezsiniz ve daha sonra kaynak kodunu kopyalayamaz ve avantajlarından yararlanamazsınız. Docker'ın ara adım önbelleklemesi. Tüm proje bağımlılıklarını her seferinde yeniden yükleyecektir.
erewok

Yukarıda belirtildiği gibi /etc/bashrcdeğil Redhat için kullanın /etc/bash.bashrc(Ubuntu için)
Jordan Gee

Centos için /root/.bashrc kullandım.
schmudu

Echo "source /yourscript.bash" >> /etc/bash.bashrc hile yapar. docker'ın içinde ros kullanıyorsanız ve ortamı kurmak istiyorsanız yapmanız gereken budur
user27221 26:18

17

Göre https://docs.docker.com/engine/reference/builder/#run için varsayılan [Linux] kabuk RUNDİR/bin/sh -c . Görünüşe göre bashisms, bu nedenle RUNkabuk belirtmek için "exec formu" kullanmalısınız .

RUN ["/bin/bash", "-c", "source /usr/local/bin/virtualenvwrapper.sh"]

Aksi takdirde, RUN'un "kabuk formunu" kullanmak ve farklı bir kabuk belirtmek iç içe kabuklara neden olur.

# don't do this...
RUN /bin/bash -c "source /usr/local/bin/virtualenvwrapper.sh"
# because it is the same as this...
RUN ["/bin/sh", "-c", "/bin/bash" "-c" "source /usr/local/bin/virtualenvwrapper.sh"]

Farklı bir kabuk gerektiren birden fazla komutunuz varsa, https://docs.docker.com/engine/reference/builder/#shell ve RUN komutlarınızdan önce yerleştirerek varsayılan kabuğunuzu değiştirmelisiniz:

SHELL ["/bin/bash", "-c"]

Son olarak, kök kullanıcı .bashrcdosyasına ihtiyacınız olan herhangi bir şey yerleştirdiyseniz ,-l bir oturum açma kabuğu yapmak ve kaynaklanmasını sağlamak bayrağı SHELLveya RUNkomutuna .

Not: Kasıtlı olarak bir komut dosyası bir RUN tek komut olarak kaynak anlamsız olduğu gerçeğini görmezden geldi.


1
SHELL ["/bin/sh", "-c", "-l"]böylece temel konteynırdan ortam ayarlarınız olması durumunda ~ / .bashrc vb. kaynakları sağlar
MortenB

1
@ MortenB, ancak /bin/shbash sorununu çözmeyecek (yazım?) Ayrıca, bunu yaparken docker buildkök kullanıcının .bashrc'sinde ihtiyacınız olan herhangi bir şeyin olması muhtemel değildir. Ancak, daha önce Dockerfile'a bir şey koyarsanız (belki de a gibi JAVA_HOME, evet.
Cevabımda

Yazım hatası için üzgünüm, temel resimlerimde doğru python sürümü için yolları ayarlamak için ~ / .bashrc kaynağı gereken pyenv kullanıyorum. Bu bana ne olursa olsun linux tabanı kullanmak ve iki satır ile python herhangi bir sürümünü eklemek yapar. Temel python 3.5.2 olduğu ubuntu16.04'teki python 3.7 gibi
MortenB

11

Docker belgelerine göre

'/ Bin / sh' dışında farklı bir kabuk kullanmak için, istenen kabuktan geçen exec formunu kullanın. Örneğin,

RUN ["/bin/bash", "-c", "echo hello"]

Bkz. Https://docs.docker.com/engine/reference/builder/#run


Bu GERÇEK doğru cevaptır. Seçilen yanıtın yazarı stackoverflow.com/a/25086628/117471 , yalnızca bağlantı verdiğiniz belgelerdeki ilk örneği okumuş görünüyor. Bir sonraki paragrafı okumuş gibi görünmüyorlar.
Bruno Bronosky

4

Eğer varsa SHELLmevcut size gitmeli bu cevap - yok sen başına bir komuta dockerfile kalanını koymak için kuvvetler kabul birini kullanın Bu yoruma .

Eski bir Docker sürümü kullanıyorsanız ve erişiminiz yoksa SHELL, hiçbir şeye ihtiyacınız olmadığı sürece çalışır .bashrc(Dockerfiles'da nadir bir durumdur):

ENTRYPOINT ["bash", "--rcfile", "/usr/local/bin/virtualenvwrapper.sh", "-ci"]

Not -ibash hiç rcfile okutmak için gereklidir.


3

Koşmak isteyebilirsiniz bash -vNeyin kaynaklandığını görmek .

Symlinks ile oynamak yerine aşağıdakileri yapardım:

RUN echo "source /usr/local/bin/virtualenvwrapper.sh" >> /etc/bash.bashrc


3

Ayrıca koşarken de sorunlar yaşadım source bir Dockerfile dosyasında yaşadım

Bu CentOS 6.6 Docker konteyneri oluşturmak için mükemmel çalışıyor, ancak Debian konteynırlarında sorunlar verdi

RUN cd ansible && source ./hacking/env-setup

Bu şekilde mücadele ettim, zarif bir yol olmayabilir ama benim için işe yarayan şey bu

RUN echo "source /ansible/hacking/env-setup" >> /tmp/setup
RUN /bin/bash -C "/tmp/setup"
RUN rm -f /tmp/setup

2

Bu olabilir source, çünkü dosya sisteminde bir yerde bir ikili yerine bash için yerleşiktir. Daha sonra kapsayıcıyı değiştirmek için kaynak oluşturduğunuz komut dosyası için niyetiniz mi?


1
Komut dosyası kapsayıcıyı güncelleştirir - ama dürüst olmak gerekirse, mantıklı olmayan bir şey yapmaya çalışıyordum, bu yüzden sorunu atladım.
Hugo Rodger-Brown

1

Ben benim env şeyler koyarak sona erdi .profileve mutasyona uğramış SHELLgibi bir şey

SHELL ["/bin/bash", "-c", "-l"]

# Install ruby version specified in .ruby-version
RUN rvm install $(<.ruby-version)

# Install deps
RUN rvm use $(<.ruby-version) && gem install bundler && bundle install

CMD rvm use $(<.ruby-version) && ./myscript.rb

3
"-c" son argüman olmalı (
command.

0

Sadece sanal ağa bir şey yüklemek için pip kullanmaya çalışıyorsanız, önce sanal ağın bin klasörüne bakmak için PATH env'sini değiştirebilirsiniz.

ENV PATH="/path/to/venv/bin:${PATH}"

Daha sonra pip installDockerfile içinde takip edilen tüm komutlar önce / path / to / venv / bin / pip komutunu bulur ve bunu kullanır, bu da sistem pythonuna değil, virtualenv'e yüklenir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.