英文:
Docker container with Postgres has no variables set when pushed with GitHub Actions
问题
I try to push my Postgres container with Github Actions to Docker Hub. I created .yml file, Dockerfile and have all secrets inside my repo:
Dockerfile
FROM postgres:latest
ENV POSTGRES_USER=${POSTGRES_USER}
ENV POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
ENV POSTGRES_DB=${POSTGRES_DATABASE}
Action file (.yml):
name: Build and Push Docker Image to Docker Hub
on:
push:
branches: ["production/*"]
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Log in to Docker Hub
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
with:
images: /* my image path */
- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: .
push: true
file: ./dockerfiles/postgres-amp-api/Dockerfile
labels: ${{ steps.meta.outputs.labels }}
tags: ${{ steps.meta.outputs.tags }}
secrets: |
"POSTGRES_USER=${{ secrets.DOCKER_POSTGRES_API_USER }}"
"POSTGRES_PASSWORD=${{ secrets.DOCKER_POSTGRES_API_PASSWORD }}"
"POSTGRES_DATABASE=${{ secrets.DOCKER_POSTGRES_API_DB }}"
It was all working when I was putting plain text db, user and password inside Dockerfile, but for some reason when I do it with the current approach, I can see in Docker Desktop that my variables are empty:
and I get this error on container startup:
Error: Database is uninitialized and superuser password is not specified.
You must specify POSTGRES_PASSWORD to a non-empty value for the
superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".
You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all
connections without a password. This is *not* recommended.
Do I miss anything? Is there any syntax error that I am not aware of?
英文:
I try to push my Postgres container with Github Actions to Docker Hub. I created .yml file, Dockerfile and have all secrets inside my repo:
Dockerfile
FROM postgres:latest
ENV POSTGRES_USER=${POSTGRES_USER}
ENV POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
ENV POSTGRES_DB=${POSTGRES_DATABASE}
Action file (.yml):
name: Build and Push Docker Image to Docker Hub
on:
push:
branches: [ "production/*" ]
jobs:
push_to_registry:
name: Push Docker image to Docker Hub
runs-on: ubuntu-latest
steps:
- name: Check out the repo
uses: actions/checkout@v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Log in to Docker Hub
uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38
with:
images: /* my image path */
- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: .
push: true
file: ./dockerfiles/postgres-amp-api/Dockerfile
labels: ${{ steps.meta.outputs.labels }}
tags: ${{ steps.meta.outputs.tags }}
secrets: |
"POSTGRES_USER=${{ secrets.DOCKER_POSTGRES_API_USER }}"
"POSTGRES_PASSWORD=${{ secrets.DOCKER_POSTGRES_API_PASSWORD }}"
"POSTGRES_DATABASE=${{ secrets.DOCKER_POSTGRES_API_DB }}"
It was all working when I was putting plain text db, user and password inside Dockerfile, but for some reason when I do it with current approach, I can see in Docker Desktop that my variables are empty:
and I get this error on container startup:
Error: Database is uninitialized and superuser password is not specified.
You must specify POSTGRES_PASSWORD to a non-empty value for the
superuser. For example, "-e POSTGRES_PASSWORD=password" on "docker run".
You may also use "POSTGRES_HOST_AUTH_METHOD=trust" to allow all
connections without a password. This is *not* recommended.
Do I miss anything? Is there any syntax error that I am not aware of?
答案1
得分: 1
Dockerfile中的变量在使用build-args传递它们之前不会被解析。
你的Dockerfile应该如下所示:
FROM postgres:latest
ARG POSTGRES_USER=postgres
ARG POSTGRES_PASSWORD=postgres
ARG POSTGRES_DATABASE=postgres
ENV POSTGRES_USER ${POSTGRES_USER}
ENV POSTGRES_PASSWORD ${POSTGRES_PASSWORD}
ENV POSTGRES_DB ${POSTGRES_DATABASE}
和操作部分:
...
...
...
- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: .
push: true
file: ./dockerfiles/postgres-amp-api/Dockerfile
labels: ${{ steps.meta.outputs.labels }}
tags: ${{ steps.meta.outputs.tags }}
build-args: |
POSTGRES_USER=${{ secrets.DOCKER_POSTGRES_API_USER }}
....
参考链接:https://www.baeldung.com/ops/dockerfile-env-variable#dynamic_values
英文:
The variable in Dockerfile will not be resolved until you pass them using build-args.
You dockerfile should look like
FROM postgres:latest
ARG POSTGRES_USER=postgres
ARG POSTGRES_PASSWORD=postgres
ARG POSTGRES_DATABASE=postgres
ENV POSTGRES_USER ${POSTGRES_USER}
ENV POSTGRES_PASSWORD ${POSTGRES_PASSWORD}
ENV POSTGRES_DB ${POSTGRES_DATABASE}
and action
...
...
...
- name: Build and push Docker image
uses: docker/build-push-action@v2
with:
context: .
push: true
file: ./dockerfiles/postgres-amp-api/Dockerfile
labels: ${{ steps.meta.outputs.labels }}
tags: ${{ steps.meta.outputs.tags }}
build-args: |
POSTGRES_USER=${{ secrets.DOCKER_POSTGRES_API_USER }}
....
reference https://www.baeldung.com/ops/dockerfile-env-variable#dynamic_values
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论