فرض کنید فایل داکری به صورت زیر داریم و می خواهیم بوسیله دستور source فایل virtualenvwrapper.sh را اجرا کنیم. اما به درستی کار نمی کند:
FROM ubuntu:12.04
RUN apt-get install python-dev -y
RUN pip install virtualenvwrapper
RUN source /usr/local/bin/virtualenvwrapper.sh
مشکل اصلی این است که Docker به طور پیشفرض از /bin/sh
برای اجرای دستورات در RUN
استفاده میکند و source
یک دستور خاص در bash
است. برای رفع این مشکل، شما میتوانید چندین راهکار زیر را امتحان کنید:
1 تغییر شل پیشفرض: با استفاده از دستور SHELL
، میتوانید شل پیشفرض را به bash
تغییر دهید. به این صورت میتوانید کد زیر را به Dockerfile اضافه کنید:
SHELL ["/bin/bash", "-c"]
با این تغییر، تمام دستورات RUN
بعدی به جای sh
با bash
اجرا میشوند و میتوانید از source
بدون مشکل استفاده کنید.
2 استفاده از نقطه (: اگر تمایل دارید از sh
استفاده کنید، میتوانید به جای source
از نقطه (.
) برای بارگذاری اسکریپت استفاده کنید:
RUN . /usr/local/bin/virtualenvwrapper.sh
3 اجرا با شل لاگین: همچنین میتوانید با استفاده از گزینه --login
، یک شل لاگین ایجاد کنید:
RUN /bin/bash --login -c 'your_commands_here'