我希望我的docker容器在Raspberry PI启动时运行,因此我创建了一个服务,该服务在this answer之后启动时执行。
这是已创建的服务:
# /etc/systemd/system/docker-compose-app.service
[Unit]
Description=Docker Compose Application Service
Requires=docker.service
After=docker.service
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=/home/ubuntu/asset-tracking/laradock
ExecStart=/usr/local/bin/docker-compose up -d nginx beacon-clocking mongo postgres
ExecStop=/usr/local/bin/docker-compose down
TimeoutStartSec=0
[Install]
WantedBy=multi-user.target
当我重新启动系统时,一切似乎都能顺利运行,但是当我访问登录页面时,我最终遇到此错误:
SQLSTATE[08006] [7] FATAL: password authentication failed for user "boilerplate_user" (SQL: select * from "settings")
现在,boilerplate_user是用于登录到postgres数据库的环境变量之一,但是看起来容器对此一无所知。
运行docker ps
显示该容器正在与其他容器一起运行。
我尝试进入postgres容器并使用环境变量登录到postgres,但是它显示role boilerplate_user does not exist
但是,很奇怪的是,如果我对已经由服务运行的容器进行docker-compose up -d postgres
操作,它不会说它是最新的,但是看起来它像以前那样运行了。首先已经运行。第二次运行后,我可以使用boilerplate_user
登录数据库,并且应用程序上的登录页面就像超级按钮一样。
我还尝试过在重新启动后禁用该服务并手动运行脚本。这样操作后,便可以使用boilerplate_user
登录。
这是我的docker-compose.yml
for postgres容器:
### PostgreSQL ###########################################
postgres:
restart: always
build: ./postgres
volumes:
- ${DATA_PATH_HOST}/postgres:/var/lib/postgresql/data
- ${POSTGRES_ENTRYPOINT_INITDB}:/docker-entrypoint-initdb.d
ports:
- "${POSTGRES_PORT}:5432"
environment:
- POSTGRES_DB=${POSTGRES_DB}
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
networks:
- backend
我希望postgres容器使用env变量,而不必在每次重新启动后手动将ssh进入系统以重新启动容器(或永久启动它)。