Buduję pojemnik na aplikację rubinową. Konfiguracja mojej aplikacji jest zawarta w zmiennych środowiskowych (ładowanych do aplikacji za pomocą dotenv ).
Jedną z tych zmiennych konfiguracyjnych jest publiczny adres IP aplikacji, który jest wykorzystywany wewnętrznie do tworzenia łączy. Muszę dodać pozycję dnsmasq wskazującą ten adres ip na 127.0.0.1 wewnątrz kontenera, aby mógł pobrać linki aplikacji tak, jakby nie były w kontenerze.
Dlatego próbuję ustawić plik ENV
Docker, który przekazałby zmienną środowiskową do kontenera.
Próbowałem kilku rzeczy.
ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`
Wszystko jednak przekazuje ciąg „REQUEST_DOMAIN” zamiast wartości zmiennej środowiskowej. Czy istnieje sposób na przekazanie wartości zmiennych środowiskowych z komputera hosta do kontenera?
Your image will not build if you have referenced an ARG in your Dockerfile but excluded it in --build-arg
mylisz się. Możesz budować obraz z referencjami nawet bez --build-arg. Ponadto możesz ustawić wartość domyślną dla argumentu build.Możesz więc zrobić:
cat Dockerfile | envsubst | docker build -t my-target -
Następnie miej plik Docker z czymś takim jak:
Myślę, że może być problem z niektórymi postaciami specjalnymi, ale działa to przynajmniej w większości przypadków.
źródło
envsubst
jako częśćbrew install gettext
. Ale z powodu możliwych konfliktów z systemem kompilacji BSD jest on „tylko do beczek” i nie są tworzone żadne symlnki. Można jednak bezpiecznieln -s /usr/local/Cellar/gettext/*/bin/envsubst /usr/local/bin/
dodać to jedno polecenie do ŚCIEŻKI. (Naprawdę chodzi o lib.) Lub możesz użyć go w jego/usr/local/Cellar/gettext/*/bin/envsubst
lokalizacjidocker build -
jest w szczególności tym, co nie działa, gdy odwołujesz się do ścieżek względnych z pliku Dockerfile, niezależnie od podstawienia zmiennej env.docker build
zamian. Przykład:cat Dockerfile | envsubst > DockerfileWithEnvVars
adocker build -t my-target -f DockerfileWithEnvVars .
następnierm DockerfileWithEnvVars
envsubst < Dockerfile | sponge Dockerfile
Alternatywnym zastosowaniem
envsubst
bez utraty możliwości używania poleceń takich jakCOPY
lubADD
i bez użycia plików pośrednich byłoby użycie Zastąpienia Procesu Basha :źródło
unable to prepare context: the Dockerfile (/dev/fd/63) must be within the build context
Załaduj zmienne środowiskowe z pliku utworzonego w czasie wykonywania.
... następnie w Dockerfile
gdzie test.sh ładuje MYVAR z env.sh
źródło
Jeśli chcesz tylko znaleźć i zastąpić wszystkie zmienne środowiskowe ($ ExampleEnvVar) w pliku Docker, skompiluj go, to zadziała:
envsubst < /path/to/Dockerfile | docker build -t myDockerImage . -f -
źródło
envsubst < ./Dockerfile | docker build -squash -t ${DOCKIMG}:${VERSION} . -f -
gdzieFROM
linia używa zmiennej środowiskowej.dodaj
-e
klucz do przekazywania zmiennych środowiskowych do kontenera. przykład:źródło