bugfix> php > 投稿

docker-compose.yaml を使用してローカル開発用のアプリを構築しています 、2つの Dockerfiles を使用して  -アプリ用(WordPress)、nginx用。これはJenkinsパイプラインを使用して構築された特定のアプリであるため、Dockerfilesを変更することはできませんが、ステージングサーバーおよび運用サーバーと同じ環境をローカルでテストできるようにしたいと思います。

php部分は機能しますが、nginxは失敗します。ザ・ Dockerfile  nginxの場合は次のようになります。

FROM nginx:latest
COPY scripts/docker-nginx-entrypoint.sh /docker-nginx-entrypoint.sh
COPY ./config/nginx.conf /opt/nginx.conf
COPY ./config/nginx.conf.prd /opt/nginx.conf.prd
COPY --from=DOCKER_IMAGE_NAME_PHP /var/www/html/ /var/www/html/
CMD ["/bin/bash","/docker-nginx-entrypoint.sh"]

DOCKER_IMAGE_NAME_PHP  一部が失敗します

ERROR: Service 'nginx' failed to build: invalid from flag value DOCKER_IMAGE_NAME_PHP: invalid reference format: repository name must be lowercase

私の docker-compose.yaml で  私が持っているnginxの部分について

nginx:
    build:
      context: .
      dockerfile: Dockerfile.static
    container_name: web-service
    working_dir: /var/www
    volumes:
      - .:/var/www
    environment:
      - "DOCKER_IMAGE_NAME_PHP=app-admin"
      - "DOCKER_IMAGE_NAME_NGINX=web-service"
    depends_on:
      - app
    ports:
      - 8090:80

environment を設定すると思った  構成ファイルで十分であり、これが使用されます( app-admin  は、 container_name です  WordPressを使用したphpの部分)。

Jenkinsパイプラインスクリプトでは、これらの名前を使用してアプリと静的イメージを手動でビルドします( docker build -t DOCKER_IMAGE_NAME_PHP -f Dockerfile.php を使用して )、名前は env に設定されます  のような

echo -e "DOCKER_IMAGE_NAME_PHP=$DOCKER_IMAGE_NAME_PHP" >>env

編集

答えと同様に、 args を追加してみました  下 build  キー

build:
  context: .
  dockerfile: Dockerfile.static
  args:
    - "DOCKER_IMAGE_NAME_PHP=app-admin"

その後、私の Dockerfile で  追加しました

FROM nginx:latest
COPY scripts/docker-nginx-entrypoint.sh /docker-nginx-entrypoint.sh
COPY ./config/nginx.conf /opt/nginx.conf
COPY ./config/nginx.conf.prd /opt/nginx.conf.prd
ARG DOCKER_IMAGE_NAME_PHP
COPY --from=$DOCKER_IMAGE_NAME_PHP /var/www/html/ /var/www/html/
CMD ["/bin/bash","/docker-nginx-entrypoint.sh"]

しかし、まだエラーが表示されます。 ${DOCKER_IMAGE_NAME_PHP} で試しました 、しかしそれは役に立たない。

奇妙なことは、 RUN echo $DOCKER_IMAGE_NAME_PHP を追加することです 、これを実行すると、表示されます

Step 6/8 : RUN echo $DOCKER_IMAGE_NAME_PHP
 ---> Running in 0801fcd5b77f
app-admin

しかし、それは COPY で認識されません  コマンド。どうして?

編集2

だから私はこれを行うことができないことがわかりました:

https://github.com/moby/moby/issues/34482

--from が  イメージ名が必要です(以前のビルドサービスから渡そうとしましたが、私の場合は動的です)。私は docker build をやっているので、これはジェンキンスで動作します  コマンド、および変数はbashスクリプトで使用可能です...

回答 2 件
  • COPY --from  変数をサポートしていませんが、 FROM  

    次の例では、マルチステージビルドを使用して、最初のイメージから必要なものを抽出しやすくしています。

    ARG DOCKER_IMAGE_NAME_PHP=php:7.3
    FROM ${DOCKER_IMAGE_NAME_PHP} as php-image
    FROM nginx:latest
    COPY scripts/docker-nginx-entrypoint.sh /docker-nginx-entrypoint.sh
    COPY ./config/nginx.conf /opt/nginx.conf
    COPY ./config/nginx.conf.prd /opt/nginx.conf.prd
    COPY --from=php-image /var/www/html/ /var/www/html/
    CMD ["/bin/bash","/docker-nginx-entrypoint.sh"]
    
    

    ほとんど同様の例がドキュメントにあります

  • そのためには、 ARG を使用する必要があります  Dockerfileで。

    https://docs.docker.com/engine/reference/builder/#arg

    environment  docker-compose.ymlのビルド中は使用できません。

    https://docs.docker.com/compose/compose-file/#environment

    docker-compose.ymlでもargを使用できます:

    https://docs.docker.com/compose/compose-file/#args

あなたの答え