0

我想使用Bitnami 的 Nginx base image提供静态网站。我有一个多阶段 Dockerfile 如下:

# build stage
FROM node:lts-alpine as build-stage
COPY ./ /app
WORKDIR /app
COPY .npmrc .npmrc
RUN npm install && npm run build

# Production stage
FROM bitnami/nginx:1.16 as production-stage
COPY --from=build-stage --chown=1001 /app/dist /app
COPY nginx.conf /opt/bitnami/nginx/conf/nginx.conf
COPY --chown=1001 entrypoint.sh /
RUN chmod +w /entrypoint.sh
CMD ["/entrypoint.sh"]

我用它entrypoint.sh来用环境变量替换一些文件内容,例如:

#!/bin/bash

function join_by { local IFS="$1"; shift; echo "$*"; }

vars=$(env | grep VUE_APP_ | awk -F = '{print "$"$1}')
vars=$(join_by ' ' $vars)

for file in /app/js/app.*;
do
  ### T H I S   L I N E   T H R O W S   E R R O R   ###
  cp $file $file.tmpl 
  envsubst "$vars" < $file.tmpl > $file
  rm $file.tmpl
done

exec "$@"

cp命令它抛出一个错误:

cp:无法创建常规文件'/app/js/app.042ea3b0.js.tmpl':权限被拒绝

如您所见,我已经复制了 dist 文件和entrypoint.shwith --chown=1001(Bitnami 图像中的默认用户),但没有任何好处。

是因为默认情况下图像文件夹app由卷公开的吗?如何复制和修改已移动到图像中的文件?

PS:它在 OpenShift 环境中运行。

4

2 回答 2

0

Bitnami 图像在postunpack.sh 脚本中执行一些操作,该脚本是从Dokerfile调用的。由于运行 nginx 的用户是非 root 用户,因此脚本执行的操作之一与配置权限有关。您可以尝试实现与您的需求类似的东西。

于 2019-09-10T07:06:53.243 回答
0

事实证明这是 Openshift 行为的结果:

如何启用图像作为设置的用户 ID 运行?

部署应用程序时,它将作为运行它的项目的唯一用户 ID 运行。这将覆盖应用程序映像定义的要运行的用户 ID。

... 最好的解决方案是构建应用程序映像,以便它可以作为任意用户 ID 运行。

因此,必须适当地设置文件chown的访问级别 ( ) ,而不是复制文件并修改它们的所有者 ( )。chmod

于 2019-09-12T18:05:19.053 回答