Utilizzando docker-compose
, l'esempio seguente mostra come è possibile ereditare le variabili di env della shell all'interno di docker-compose.yml e, a sua volta, qualsiasi Dockerfile chiamato da docker-compose
per creare immagini. Ho trovato questo utile se dico nel comando Dockerfile
RUN
Ho bisogno di eseguire comandi specifici per l'ambiente.
(la shell ha RAILS_ENV=development
già esistente nell'ambiente)
finestra mobile-compose.yml:
version: '3.1'
services:
my-service:
build:
#$RAILS_ENV is referencing the shell environment RAILS_ENV variable
#and passing it to the Dockerfile ARG RAILS_ENV
#the syntax below ensures that the RAILS_ENV arg will default to
#production if empty.
#note that is dockerfile: is not specified it assumes file name: Dockerfile
context: .
args:
- RAILS_ENV=${RAILS_ENV:-production}
environment:
- RAILS_ENV=${RAILS_ENV:-production}
Dockerfile:
FROM ruby:2.3.4
#give ARG RAILS_ENV a default value = production
ARG RAILS_ENV=production
#assign the $RAILS_ENV arg to the RAILS_ENV ENV so that it can be accessed
#by the subsequent RUN call within the container
ENV RAILS_ENV $RAILS_ENV
#the subsequent RUN call accesses the RAILS_ENV ENV variable within the container
RUN if [ "$RAILS_ENV" = "production" ] ; then echo "production env"; else echo "non-production env: $RAILS_ENV"; fi
In questo modo non ho bisogno per specificare le variabili di ambiente nei file o docker-compose
build
/up
comandi:
docker-compose build
docker-compose up
C'è un modo più semplice per fare questo? È davvero irritante dover ricreare il contenitore con variabili diverse ogni volta. Magari conservarlo in un file? –
Memorizzo i comandi di esecuzione della finestra mobile negli script della shell, (./start_staging.sh ecc.) Quindi li eseguo in remoto utilizzando Ansible. – errata
Ho problemi a far funzionare la seconda versione; Ho impostato PASSWORD = foo nell'ambiente, quindi ho passato --env PASSWORD, e solo la parola "PASSWORD" appare nel config.json del contenitore; ogni altra variabile d'ambiente ha una chiave e un valore. Sto usando Docker 1.12.1. –