我正在运行一个Docker源代码,它有一个Dockerfile,看起来像这样:
FROM node:14-slim as build
# install node-gyp dependencies
RUN apt-get update && apt-get upgrade -y && apt-get install -y --no-install-recommends apt-utils cron g++ make python
# add pin script
WORKDIR /
ADD scripts/pinVersions.js scripts/cleanup.sh ./
RUN chmod +x /cleanup.sh
# build server
WORKDIR /app
ADD packages/server .
RUN node /pinVersions.js && yarn && yarn build && /cleanup.sh
# build worker
WORKDIR /worker
ADD packages/worker .
RUN node /pinVersions.js && yarn && yarn build && /cleanup.sh
FROM couchdb:3.2.1
# TARGETARCH can be amd64 or arm e.g. docker build --build-arg TARGETARCH=amd64
ARG TARGETARCH amd64
#TARGETBUILD can be set to single (for single docker image) or aas (for azure app service)
# e.g. docker build --build-arg TARGETBUILD=aas ....
ARG TARGETBUILD single
ENV TARGETBUILD $TARGETBUILD
COPY --from=build /app /app
COPY --from=build /worker /worker
ENV
APP_PORT=4001
ARCHITECTURE=amd
BUDIBASE_ENVIRONMENT=PRODUCTION
CLUSTER_PORT=80
# CUSTOM_DOMAIN=budi001.custom.com
DEPLOYMENT_ENVIRONMENT=docker
MINIO_URL=http://localhost:9000
POSTHOG_TOKEN=phc_fg5I3nDOf6oJVMHSaycEhpPdlgS8rzXG2r6F2IpxCHS
REDIS_URL=localhost:6379
SELF_HOSTED=1
TARGETBUILD=$TARGETBUILD
WORKER_PORT=4002
WORKER_URL=http://localhost:4002
APPS_URL=http://localhost:4001
# These secret env variables are generated by the runner at startup
# their values can be overriden by the user, they will be written
# to the .env file in the /data directory for use later on
# REDIS_PASSWORD=something
# COUCHDB_PASSWORD=something
# COUCHDB_USER=something
# COUCH_DB_URL=http://something@localhost:5984
# INTERNAL_API_KEY=something
# JWT_SECRET=something
# MINIO_ACCESS_KEY=something
# MINIO_SECRET_KEY=something
有一个runner.sh看起来像这样:
#!/bin/bash
declare -a ENV_VARS=("COUCHDB_USER" "COUCHDB_PASSWORD" "MINIO_ACCESS_KEY" "MINIO_SECRET_KEY" "INTERNAL_API_KEY" "JWT_SECRET" "REDIS_PASSWORD")
if [ -f "/data/.env" ]; then
export $(cat /data/.env | xargs)
fi
# first randomise any unset environment variables
for ENV_VAR in "${ENV_VARS[@]}"
do
temp=$(eval "echo $$ENV_VAR")
if [[ -z "${temp}" ]]; then
eval "export $ENV_VAR=$(uuidgen | sed -e 's/-//g')"
fi
done
if [[ -z "${COUCH_DB_URL}" ]]; then
export COUCH_DB_URL=http://$COUCHDB_USER:$COUCHDB_PASSWORD@localhost:5984
fi
if [ ! -f "/data/.env" ]; then
touch /data/.env
for ENV_VAR in "${ENV_VARS[@]}"
do
temp=$(eval "echo $$ENV_VAR")
echo "$ENV_VAR=$temp" >> /data/.env
done
fi
# make these directories in runner, incase of mount
mkdir -p /data/couch/dbs /data/couch/views
chown couchdb:couchdb /data/couch /data/couch/dbs /data/couch/views
redis-server --requirepass $REDIS_PASSWORD &
/opt/clouseau/bin/clouseau &
/minio/minio server /data/minio &
/docker-entrypoint.sh /opt/couchdb/bin/couchdb &
/etc/init.d/nginx restart
if [[ ! -z "${CUSTOM_DOMAIN}" ]]; then
# Add monthly cron job to renew certbot certificate
echo -n "* * 2 * * root exec /app/letsencrypt/certificate-renew.sh ${CUSTOM_DOMAIN}" >> /etc/cron.d/certificate-renew
chmod +x /etc/cron.d/certificate-renew
# Request the certbot certificate
/app/letsencrypt/certificate-request.sh ${CUSTOM_DOMAIN}
fi
/etc/init.d/nginx restart
pushd app
pm2 start --name app "yarn run:docker"
popd
pushd worker
pm2 start --name worker "yarn run:docker"
popd
sleep 10
curl -X PUT ${COUCH_DB_URL}/_users
curl -X PUT ${COUCH_DB_URL}/_replicator
sleep infinity
现在我想知道应该随机生成的COUCHDB_USER和COUCHDB_PASSWORD的值是多少。
- 我试过
docker exec -it containername /bin/bash
和printenv
,但不存在 - 我尝试了
docker exec -it containername /bin/bash
并查找/data文件夹,找不到任何.env文件
码头工人专家能告诉我在哪里可以找到环境变量吗?
这并不是一个真正的Docker问题:这里发生的一切都不是特定于Docker的。
环境变量设置在runner.sh
中。这些变量设置在两个位置:
-
如果脚本开头存在
/data/.env
,则这些变量将导出到环境:if [ -f "/data/.env" ]; then export $(cat /data/.env | xargs) fi
-
列表
ENV_VARS
中以前未设置的变量为设置为随机值,然后导出到环境:for ENV_VAR in "${ENV_VARS[@]}" do temp=$(eval "echo $$ENV_VAR") if [[ -z "${temp}" ]]; then eval "export $ENV_VAR=$(uuidgen | sed -e 's/-//g')" fi done
您不会在docker exec -it containername /bin/bash
中看到它们,因为该shell不是runner.sh
的子级,所以它当然不会看到该脚本设置的环境变量。
看起来好像CCD_ 9应该无条件地创建CCD_,所以不清楚你为什么没有看到它。注意,你不会看到CCD_ 11与一个简单的CCD_;例如,您需要运行ls -A /.data
。
更新
如果我按照图像构建指令,然后启动图像(docker run --name budibase budibase:latest
(,那么当我将docker exec
放入生成的容器中时,我会看到/data/.env
:
$ docker exec budibase ls -A /data
.env
couch
minio